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


83

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

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

4
क्या आप संबंधित कोड पोस्ट करना चाहेंगे MyClass?
nattyddubbs

जवाबों:


128

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

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`

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

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

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

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

b) एक्सटेंशन लगाएं System.Type

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

तथा

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

2
यानी आपका कोड `Type.Label MyClass.Label` की तलाश में है , not
पीटर रिची

यह कैसे विस्तार पर रखा जाएगा System.Type जहां यह पाया जाएगा /। इसे निष्पादित करने के लिए कोड कहां जाता है?
डिमोड्वे

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

यदि आपको यह त्रुटि मिलती है: "टाइप में गेटप्रॉपर्टी की परिभाषा नहीं है" तो इसे पढ़ें: stackoverflow.com/questions/7858469/…
Tadej

27

यह एक अलग प्रश्न का उत्तर देता है:

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

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

यदि संपत्ति मौजूद है तो (लेकिन केवल नहीं तो) सही है।

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

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

यहां मेरी मदद की।

संपादित करें: आजकल, यह शायद nameofकड़े संपत्ति के नाम के बजाय ऑपरेटर का उपयोग करने के लिए स्मार्ट है ।


nameofऑपरेटर के उपयोग के संबंध में , क्या यह एक संपत्ति का नाम पाने के लिए काम करेगा (अपवाद नहीं फेंका गया) जो मौजूद नहीं हो सकता है? चूंकि मूल प्रश्न का आधार यह था कि हम नहीं जानते कि क्या यह संपत्ति मौजूद है?
ज़ो

आप इसे क्यों नहीं आजमाते हैं और फिर स्पष्ट करने के लिए मेरे उत्तर को संपादित करते हैं?
स्टैचू

2

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

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

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

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

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

ओह, आपने अभी-अभी कॉल GetPropertyकिया है typeof(MyClass)typeof(MyClass)है Typeयकीन है कि के लिए कोई है जो Labelसंपत्ति।


डिफ़ॉल्ट बाइंडिंग ध्वज का उपयोग किया जाता है Instance|Public|Static, iirc।
ल्यूक

@ ल्यूक, मुझे यकीन नहीं था, इसलिए मैंने 'सही' लिखा और 'उदा' को जोड़ा :) :) शायद Labelनिजी संपत्ति है।
Zdeslav Vojkovic

1

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

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

using System.Reflection;

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

}

0

अगर तुम ऐसे बंधे हो जैसे मैं था:

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

0

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.