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




.net reflection (6)

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

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);
}

Answers

मुझे यह त्रुटि मिली: स्वीकृत उत्तर टाइप करते समय "टाइप में GetProperty की परिभाषा नहीं है"।

यही वह है जिसके साथ मैंने समाप्त किया:

using System.Reflection;

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

}

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

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");

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

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

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

यदि यह पता लगाने की कोशिश कर रहा है कि क्या एक ऑब्जेक्ट (कक्षा नहीं) की संपत्ति है,

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

अगर सच है (लेकिन न केवल अगर) संपत्ति सच है।

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

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

मुझे यहाँ मदद की।


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

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

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

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

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

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


तुम कोशिश कर सकते हो:

unless defined?(var)
  #ruby code goes here
end
=> true

क्योंकि यह एक बुलियन लौटाता है।





c# .net reflection