c# - जांच करें कि एक वर्ग में कोई संपत्ति मौजूद है या नहीं




.net reflection (4)

मैं यह जानने की कोशिश करता हूं कि कक्षा में कोई संपत्ति मौजूद है या नहीं, मैंने यह कोशिश की:

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 संभावनाएं हैं।

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

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

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

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

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


आपकी विधि इस तरह दिखती है:

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

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

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

आपकी विधि किसी वर्ग के उदाहरण की अपेक्षा करती है, न कि Type । अन्यथा आप अनिवार्य रूप से कर रहे हैं

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`

जैसा कि @ पीटररची सही ढंग से इंगित करता है, इस बिंदु पर आपका कोड सिस्टम पर संपत्ति Label तलाश कर रहा है। System.Type । वह संपत्ति मौजूद नहीं है।

समाधान या तो है

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

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

बी) System.Type पर विस्तार रखो। System.Type

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

तथा

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

मैं इस संदर्भ के बारे में अनिश्चित हूं कि इसकी आवश्यकता क्यों थी, इसलिए यह आपके लिए पर्याप्त जानकारी नहीं दे सकता है, लेकिन यही वह है जो मैं करने में सक्षम था:

if(typeof(ModelName).GetProperty("Name of Property") != null)
{
//whatevver you were wanting to do.
}

मेरे मामले में मैं प्रपत्र जमा करने से गुणों के माध्यम से चल रहा हूं और यदि प्रविष्टि खाली छोड़ दी गई है तो इसका उपयोग करने के लिए डिफ़ॉल्ट मान भी हैं - इसलिए मुझे यह जानने की आवश्यकता है कि उपयोग करने के लिए कोई मूल्य था या नहीं - मैंने मॉडल में अपने सभी डिफ़ॉल्ट मानों को पूर्ववत किया डिफॉल्ट के साथ मुझे बस इतना करना है कि जांच करें कि उसके साथ शुरू हुई कोई संपत्ति थी या नहीं।


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

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




reflection