2011-09-11 16 views
12

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

class MyClass : IMyInterface 
{ 
    public void SomeMethod(); 
} 

इंटरफेस को लागू करने:

interface IMyInterface 
{ 
    void SomeMethod(); 
} 

मैं अगर एक निश्चित विधि को लागू करता है IMyInterface (प्रतिबिंब का उपयोग) कार्यावधि में पता करने में सक्षम होना चाहता हूँ।

+1

आप मतलब है कि आप निर्धारित करने के लिए 'MyClass.SomeMethod()' 'की IMyInterface.SomeMethod()' एक स्पष्ट कार्यान्वयन है करना चाहते हैं? –

+0

कोई जरूरी नहीं है लेकिन मुझे पता है कि मुझे प्राप्त एक विधिबेस वस्तु एक विशिष्ट इंटरफ़ेस विधि का कार्यान्वयन है या नहीं। –

उत्तर

12

आप इस के लिए GetInterfaceMap उपयोग कर सकते हैं का उपयोग नहीं है।

InterfaceMapping map = typeof(MyClass).GetInterfaceMap(typeof(IMyInterface)); 

foreach (var method in map.TargetMethods) 
{ 
    Console.WriteLine(method.Name + " implements IMyInterface"); 
} 
+1

+1। वास्तव में कमाल, इस बारे में कभी नहीं सुना। – Tigran

+0

दुर्भाग्य से टाइपबिल्डर के लिए काम नहीं करता है। –

-5

यदि आपको प्रतिबिंब का उपयोग नहीं करना है, तो न करें। यह के रूप में performant के रूप में, कहते हैं, is ऑपरेटर या as ऑपरेटर

class MyClass : IMyInterface 
{ 
    public void SomeMethod(); 
} 

if (someInstance is IMyInterface) dosomething(); 

var foo = someInstance as IMyInterface; 
if (foo != null) foo.SomeMethod(); 
+0

मैं जानना चाहता हूं कि प्रतिबिंब द्वारा आपूर्ति की गई विधि एक इंटरफेस लागू करती है - अगर आप इसका उपयोग करते हैं तो यह –

+0

पर कॉल न करें और यह सच हो जाए, तो आप जानते हैं कि यह आपके इंटरफ़ेस को लागू करता है। –

+0

दोबारा - मुझे यह निर्धारित करने के लिए विधिबेस से पूछताछ करने में दिलचस्पी है कि विधि इंटरफ़ेस में विधि का कार्यान्वयन उदाहरण नहीं है। –

6

आप उस के लिए Type.GetInterfaceMap() उपयोग कर सकते हैं:

bool Implements(MethodInfo method, Type iface) 
{ 
    return method.ReflectedType.GetInterfaceMap(iface).TargetMethods.Contains(method); 
} 
+0

यह अच्छा है। ध्यान दें कि इंटरफेस मैपिंग एक संरचना है, इसलिए आप इसे शून्य के लिए नहीं देखते हैं बल्कि एक ArgumentException पकड़ते हैं। – user420667

संबंधित मुद्दे