2009-07-11 10 views
23

मैं एक इंटरफ़ेस विधि का एक MethodInfo और एक वर्ग कि इंटरफ़ेस लागू करता है की Type है। मैं कक्षा विधि के MethodInfo को ढूंढना चाहता हूं जो इंटरफ़ेस विधि लागू करता है।कक्षा विधि के MethodInfo को कार्यान्वित करने, इंटरफ़ेस विधि के MethodInfo कैसे प्राप्त करें?

सरल method.GetBaseDefinition() इंटरफ़ेस विधियों के साथ काम नहीं करता है। नाम से लुकअप या तो काम नहीं करेगा, क्योंकि इंटरफ़ेस विधि को लागू करते समय स्पष्ट रूप से इसका कोई नाम हो सकता है (हाँ, सी # में नहीं)।

तो सही क्या है जो सभी संभावनाओं को पूरा करने का तरीका है?

उत्तर

33

ठीक है, मुझे GetInterfaceMap का उपयोग करके एक रास्ता मिला।

var map = targetType.GetInterfaceMap(interfaceMethod.DeclaringType); 
var index = Array.IndexOf(map.InterfaceMethods, interfaceMethod); 

if (index == -1) 
{ 
    //this should be literally impossible 
} 

return map.TargetMethods[index]; 
1

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

एक भी विधि (MyMethod) और मेरे प्रकार (MyClass) जो इस विधि मैं इस का उपयोग कर सकते लागू करता है के साथ अपने इंटरफेस के लिए: कि MethodInfo.Equals अगर काम करता है की जाँच करने के

MethodInfo interfaceMethodInfo = typeof(IMyInterface).GetMethod("MyMethod"); 
MethodInfo classMethodInfo = null; 
Type[] interfaces = typeof(MyClass).GetInterfaces(); 

foreach (Type iface in interfaces) 
{ 
    MethodInfo[] methods = iface.GetMethods(); 

    foreach (MethodInfo method in methods) 
    { 
     if (method.Equals(interfaceMethodInfo)) 
     { 
      classMethodInfo = method; 
      break; 
     } 
    } 
} 

आपके पास होगी दो तरीकों के अलग-अलग नाम हैं। मुझे यह भी पता नहीं था कि संभव था, शायद मैं एक सी # 'एर

+0

आप नाम से मेल नहीं खाते हैं। नाम से मेल नहीं खाते हैं। यह एक सी # नियम है, अन्य भाषाओं (वीबी) आपको जो भी पसंद है ओवरराइडिंग विधियों का नाम दें। –

+0

ऊपर मेरा नमूना नाम से मेल नहीं खाता है, यह MethodInfo पर समान विधि से मेल खाता है। मेरा मतलब यह था कि आपको उस विधि को जांचने की आवश्यकता होगी। MethodInfo.Equals अभी भी दो उदाहरणों को बराबर मानता है यदि वे केवल नाम से भिन्न होते हैं। –

+0

ठीक है, क्षमा करें, लेकिन आपका कोड अभी भी जो भी मुझे चाहिए वह नहीं कर रहा है। यह मुझे कक्षा 'विधि जानकारी नहीं देगा - यह मुझे इंटरफ़ेस' विधि जानकारी देगा। आप केवल यह कहते हैं कि कक्षा इंटरफ़ेस लागू करती है। –

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