2013-03-11 8 views
40

मुझे पता है कि अगर एक संपत्ति एक वर्ग में मौजूद कोशिश में मौजूद हैं, मैंने कोशिश की यह:देखें कि क्या एक संपत्ति एक वर्ग

public static bool HasProperty(this object obj, string propertyName) 
{ 
    return obj.GetType().GetProperty(propertyName) != null; 
} 

मुझे समझ नहीं आता क्यों पहली परीक्षा पद्धति में नहीं होता है?

[TestMethod] 
public void Test_HasProperty_True() 
{ 
    var res = typeof(MyClass).HasProperty("Label"); 
    Assert.IsTrue(res); 
} 

[TestMethod] 
public void Test_HasProperty_False() 
{ 
    var res = typeof(MyClass).HasProperty("Lab"); 
    Assert.IsFalse(res); 
} 
+2

आप आपत्ति तो नहीं है:

यह क्या मैं के साथ समाप्त हो गया है? – nattyddubbs

उत्तर

62

आपका विधि इस प्रकार है:

public static bool HasProperty(this object obj, string propertyName) 
{ 
    return obj.GetType().GetProperty(propertyName) != null; 
} 

यह object पर एक विस्तार कहते हैं - सब कुछ के आधार वर्ग। जब आप इस विस्तार के फोन आप इसे एक Type गुजर रहे हैं:

var res = typeof(MyClass).HasProperty("Label"); 

आपका विधि एक वर्ग है, न कि Type के उदाहरण की उम्मीद है। नहीं तो आप अनिवार्य रूप से इस बात के लिए अपने कोड System.Type पर संपत्ति Label की तलाश में है पर

typeof(MyClass) - this gives an instanceof `System.Type`. 

फिर

type.GetType() - this gives `System.Type` 
Getproperty('xxx') - whatever you provide as xxx is unlikely to be on `System.Type` 

@PeterRitchie सही ढंग से बताते हैं के रूप में, कर रहे हैं। वह संपत्ति मौजूद नहीं है।

var myInstance = new MyClass() 
myInstance.HasProperty("Label") 

ख) System.Type

public static bool HasProperty(this Type obj, string propertyName) 
{ 
    return obj.GetProperty(propertyName) != null; 
} 

और

पर विस्तार रखो:

समाधान या तो

क) एक उदाहरण MyClass का विस्तार करने के लिए प्रदान करें

typeof(MyClass).HasProperty("Label"); 
+2

यानी आपका कोड 'Type.Label' की तलाश में है, न कि' MyClass.Label'। –

+0

इसे विस्तार प्रणाली पर कैसे रखा जाएगा। टाइप करें कि यह कहां मिलेगा /। निष्पादित करने के लिए कोड में यह कहां जाता है? – Demodave

+1

@ डेमोडाव - विस्तार विधियां सिर्फ सार्वजनिक स्थैतिक वर्ग में हैं। अधिक जानकारी के लिए देखें: https://msdn.microsoft.com/en-GB/library/bb383977.aspx – Jamiec

2

2 संभावनाएं हैं।

आपके पास वास्तव में Label संपत्ति नहीं है।

आपको उपयुक्त GetProperty overload पर कॉल करने और सही बाध्यकारी झंडे को पारित करने की आवश्यकता है, उदा। BindingFlags.Public | BindingFlags.Instance

यदि आपकी संपत्ति सार्वजनिक नहीं है, तो आपको BindingFlags.NonPublic या झंडे के कुछ अन्य संयोजनों का उपयोग करने की आवश्यकता होगी जो आपके उपयोग के मामले में फिट बैठते हैं। विवरण खोजने के लिए संदर्भित एपीआई दस्तावेज़ पढ़ें।

संपादित करें:

ओह, केवल आपके typeof(MyClass) पर GetProperty फोन देखा। typeof(MyClass)Type है जो निश्चित रूप से Label संपत्ति नहीं है।

+0

उपयोग किए जाने वाले डिफ़ॉल्ट बाध्यकारी झंडे 'इंस्टेंस | पब्लिक | स्टेटिक', आईआईआरसी हैं। – LukeH

+0

@LukeH, मुझे यकीन है कि नहीं था, इसलिए मैं 'सही' लिखा था और कहा कि 'जैसे:' :) शायद 'Label' निजी संपत्ति है। –

10

यह एक अलग प्रश्न का उत्तर देता है, लेकिन उम्मीद है कि यह किसी को पढ़ने के लिए सहायक हो सकता है।मैं एक अलग समस्या लिए खोज रहा था और यह मेरा समाधान था:

यह पता लगाने की अगर एक वस्तु (नहीं वर्ग) एक संपत्ति है की कोशिश कर रहा है, तो

OBJECT.GetType().GetProperty("PROPERTY") != null 

रिटर्न सच अगर (लेकिन न केवल अगर) संपत्ति मौजूद है।

मेरे मामले में, मैं एक ASP.NET MVC आंशिक दृश्य में था और यदि या तो संपत्ति का अस्तित्व नहीं था कुछ प्रस्तुत करना चाहते थे, या संपत्ति (बुलियन) सच था।

@if ((Model.GetType().GetProperty("AddTimeoffBlackouts") == null) || 
     Model.AddTimeoffBlackouts) 

ने मुझे यहां मदद की।

+0

मैं वास्तव में क्या जरूरत है, इस पोस्ट करने के लिए धन्यवाद! – Rob

0

आप बाध्यकारी कर रहे हैं जैसे मैं था:

<%# Container.DataItem.GetType().GetProperty("Property1") != null ? DataBinder.Eval(Container.DataItem, "Property1") : DataBinder.Eval(Container.DataItem, "Property2") %> 
0

मैं यह त्रुटि आई: "प्रकार getProperty के लिए एक परिभाषा शामिल नहीं है" जब स्वीकार किए जाते हैं जवाब बराबरी कर ली। `MyClass` से प्रासंगिक कोड पोस्टिंग

using System.Reflection; 

if (productModel.GetType().GetTypeInfo().GetDeclaredProperty(propertyName) != null) 
{ 

} 
संबंधित मुद्दे