जवाबों:
आप ऐसा कुछ लिख सकते हैं:
public static bool HasMethod(this object objectToCheck, string methodName)
{
var type = objectToCheck.GetType();
return type.GetMethod(methodName) != null;
}
संपादित करें: आप एक एक्सटेंशन विधि भी कर सकते हैं और इसे इस तरह से उपयोग कर सकते हैं
myObject.HasMethod("SomeMethod");
प्रतिबिंब के माध्यम से
var property = object.GetType().GetProperty("YourProperty")
property.SetValue(object,some_value,null);
ऐसा ही तरीकों के लिए है
GetType()
जैसी विधि है GetProperties()
। यह वापस लौट रहा है PropertyInfo
। लेकिन मैं GetProperties()
विधि का उपयोग कैसे कर सकता हूं ?
यह एक पुराना सवाल है, लेकिन मैं इसमें भाग गया।
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;
}
}
क्या इसके लिए किसी गतिशील प्रकार का उपयोग नहीं करना बेहतर होगा, और अपनी कक्षा को एक इंटरफ़ेस लागू करने दें। फिर, आप रनटाइम पर देख सकते हैं कि कोई ऑब्जेक्ट इंटरफ़ेस लागू करता है, और इस प्रकार, अपेक्षित विधि (या संपत्ति) है।
public interface IMyInterface
{
void Somemethod();
}
IMyInterface x = anyObject as IMyInterface;
if( x != null )
{
x.Somemethod();
}
मुझे लगता है कि यह एकमात्र सही तरीका है।
जिस चीज़ का आप ज़िक्र कर रहे हैं वह duck-typing है, जो उन परिदृश्यों में उपयोगी है जहाँ आपको पहले से ही पता है कि ऑब्जेक्ट में विधि है, लेकिन कंपाइलर उसके लिए जाँच नहीं कर सकता है। यह उदाहरण के लिए COM इंटरोप परिदृश्यों में उपयोगी है। ( इस लेख की जाँच करें )
यदि आप उदाहरण के लिए प्रतिबिंब के साथ बतख-टाइपिंग को जोड़ना चाहते हैं, तो मुझे लगता है कि आप बतख-टाइपिंग के लक्ष्य को याद कर रहे हैं।
DynamicObject
?