कैसे जांचें कि क्या किसी वस्तु की कुछ विधि / संपत्ति है?


155

शायद गतिशील पैटर्न का उपयोग? आप डायनामिक कीवर्ड का उपयोग करके किसी भी विधि / संपत्ति को सही कह सकते हैं? उदाहरण के लिए myDynamicObject.DoStuff () को कॉल करने से पहले विधि मौजूद है या नहीं, इसकी जांच कैसे करें?


MyDynamicObject का प्रकार क्या है ? क्या यह एक वर्ग से लिया गया है DynamicObject?
चेंग चेन

डायनामिक कीवर्ड के साथ घोषित कुछ
लुइस Rhys

जवाबों:


224

आप ऐसा कुछ लिख सकते हैं:

public static bool HasMethod(this object objectToCheck, string methodName)
{
    var type = objectToCheck.GetType();
    return type.GetMethod(methodName) != null;
} 

संपादित करें: आप एक एक्सटेंशन विधि भी कर सकते हैं और इसे इस तरह से उपयोग कर सकते हैं

myObject.HasMethod("SomeMethod");

गेट टाइप () रनटाइम प्रकार लौटाएगा? (यानी आपत्ति नहीं?)
लुई राइस

2
हां, GetType () टाइपिंग को लौटाता है जबकि टाइपऑफ () ऑब्जेक्ट लौटाएगा।
जुलिएन

1
डॉक्स गेटपाइप () के अनुसार "वर्तमान उदाहरण का सटीक रनटाइम प्रकार" वापस आ जाएगा।
tzup

इसके अलावा, विस्तार विधि को स्थिर करने की आवश्यकता होगी।
फ्रेजर

9
मैं लिखने के लिए पसंद करते हैं: objectToCheck.GetType () GetMethod (methodName) = अशक्त।!
efirat

85

प्रतिबिंब के माध्यम से

 var property = object.GetType().GetProperty("YourProperty")
 property.SetValue(object,some_value,null);

ऐसा ही तरीकों के लिए है


अच्छा लगा। आप उचित परिभाषित संपत्ति प्राप्त करने के लिए GetMethod को लूप में भी कर सकते हैं।
जन्नर

यूआई नियंत्रण के जुड़ा हुआ सूचियों और उनके माता पिता के माध्यम से पाशन के लिए उपयोगी
Chicowitz

में GetType()जैसी विधि है GetProperties()। यह वापस लौट रहा है PropertyInfo। लेकिन मैं GetProperties()विधि का उपयोग कैसे कर सकता हूं ?
योगेश पटेल

43

यह एक पुराना सवाल है, लेकिन मैं इसमें भाग गया। Type.GetMethod(string name)उस नाम के साथ एक से अधिक विधि होने पर AmbiguousMatchException को फेंक देगा, इसलिए हम उस मामले को बेहतर तरीके से संभालेंगे

public static bool HasMethod(this object objectToCheck, string methodName)
{
    try
    {
        var type = objectToCheck.GetType();
        return type.GetMethod(methodName) != null;
    }
    catch(AmbiguousMatchException)
    {
        // ambiguous means there is more than one result,
        // which means: a method with that name does exist
        return true;
    }
} 

18

क्या इसके लिए किसी गतिशील प्रकार का उपयोग नहीं करना बेहतर होगा, और अपनी कक्षा को एक इंटरफ़ेस लागू करने दें। फिर, आप रनटाइम पर देख सकते हैं कि कोई ऑब्जेक्ट इंटरफ़ेस लागू करता है, और इस प्रकार, अपेक्षित विधि (या संपत्ति) है।

public interface IMyInterface
{
   void Somemethod();
}


IMyInterface x = anyObject as IMyInterface;
if( x != null )
{
   x.Somemethod();
}

मुझे लगता है कि यह एकमात्र सही तरीका है।

जिस चीज़ का आप ज़िक्र कर रहे हैं वह duck-typing है, जो उन परिदृश्यों में उपयोगी है जहाँ आपको पहले से ही पता है कि ऑब्जेक्ट में विधि है, लेकिन कंपाइलर उसके लिए जाँच नहीं कर सकता है। यह उदाहरण के लिए COM इंटरोप परिदृश्यों में उपयोगी है। ( इस लेख की जाँच करें )

यदि आप उदाहरण के लिए प्रतिबिंब के साथ बतख-टाइपिंग को जोड़ना चाहते हैं, तो मुझे लगता है कि आप बतख-टाइपिंग के लक्ष्य को याद कर रहे हैं।


2
क्या होगा यदि ऑब्जेक्ट .NET फ्रेमवर्क द्वारा प्रदान की गई वस्तु है, और मैं इसे कुछ भी लागू करने की घोषणा नहीं कर सकता?
लुई राइस

समस्या क्या है ? आप जाँच सकते हैं कि क्या 'ऑब्जेक्ट' एक ऐसी वस्तु है, जो .NET फ्रेमवर्क द्वारा ठीक उसी तरह प्रदान की जाती है
फ्रेडरिक घीसेल्स

उदाहरण के लिए, आप जांचना चाहते हैं कि किसी ऑब्जेक्ट में "ऐड" विधि है या नहीं। एएनडी ऑब्जेक्ट एक सूची हो सकती है <int>, या कुछ अन्य वर्ग जो IEnumerable नहीं है
लुईस

3
शायद आपको COM के साथ एक Adobe उत्पाद को स्क्रिप्ट करने पर एक नज़र डालनी चाहिए। एक ही फ़ंक्शन कॉल पूरी तरह से अलग-अलग COM ऑब्जेक्ट्स को वापस कर सकती है, और (Adobe के) डिज़ाइन से, उनका एकमात्र सामान्य पूर्वज ऑब्जेक्ट है। इसके अलावा: यह किसी भी आधुनिक गतिशील स्क्रिप्टिंग भाषा (पायथन, जावास्क्रिप्ट, वीबी स्क्रिप्ट, पीएचपी, लुआ ... मैं पर और पर जा सकता है) में एक सामान्य पैटर्न है। यह एक बग नहीं है, यह एक सुविधा है।
टिम कीटिंग

5
यह एक गंध है लेकिन इसे Microsoft द्वारा बनाया गया था। WebControls जैसे कि Button, LinkButton इत्यादि को देखें, वे दोनों OnClientClick संपत्ति को लागू करते हैं लेकिन, कहते हैं, ListControl और पैनल नहीं करते हैं। OnClientClick इंटरफ़ेस में परिभाषित नहीं है, इसलिए प्रतिबिंब एकमात्र विकल्प है।
हैमरइप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.