2010-01-28 9 views
8

के हस्ताक्षर के साथ विधि है अगर मैं एक वस्तु एक विशिष्ट प्रतिनिधिजांच वस्तु प्रतिनिधि

public delegate T GetSomething<T>(int aParameter); 
    public static void Method<T>(object o, GetSomething<T> gs) 
    { 
     //check if 'o' has a method with the signature of 'gs' 
    } 

उत्तर

5

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

var matchingMethods = o.GetType().GetMethods().Where(mi => 
    mi.ReturnType == gs.Method.ReturnType 
    && mi.GetParameters().Select(pi => pi.ParameterType) 
     .SequenceEqual(gs.Method.GetParameters().Select(pi => pi.ParameterType))); 
+0

यह काम करता है। इसके अलावा, क्या यह पता लगाना संभव है कि 'जी' 'ओ' के प्रतिनिधि हैं या नहीं? – Fabiano

+1

@ फ़ैबियानो: हाँ, 'जीएस के माध्यम से। लक्ष्य': 'अगर (जीएस। लक्ष्य == ओ) {/ * जीएस उदाहरण में एक विधि का प्रतिनिधित्व करता है o * /}' –

+0

धन्यवाद। मुझे अभी पता चला है कि दूसरा मामला मेरे मामले के लिए पर्याप्त होगा :-) – Fabiano

7
// You may want to tweak the GetMethods for private, static, etc... 
foreach (var method in o.GetType().GetMethods(BindingFlags.Public)) 
{ 
    var del = Delegate.CreateDelegate(gs.GetType(), method, false); 
    if (del != null) 
    { 
     Console.WriteLine("o has a method that matches the delegate type"); 
    } 
} 
+0

यह काम नहीं प्रतीत होता है। क्या यह संभव है कि Delegate.CreateDelegate केवल स्थिर तरीकों के लिए काम करता है? – Fabiano

+1

उदाहरण के तरीकों के लिए आपको किसी अन्य हस्ताक्षर का उपयोग करना चाहिए, उदाहरण के संदर्भ को पास करना: 'प्रतिनिधि। बनाएंडेटेट (gs.GetType(), ओ, विधि, झूठी); ' – torvin

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