2010-04-26 15 views
8

पर बाध्यकारी त्रुटि मुझे प्रतिबिंब और जेनेरिक का उपयोग करके प्रतिनिधि का संग्रह बनाने में समस्याएं आ रही हैं।प्रतिनिधि। क्रिएटडिलेगेट() और जेनेरिक: लक्ष्य विधि

मैं सहयोगी विधियों से एक प्रतिनिधि संग्रह बनाने की कोशिश कर रहा हूं, जिसका साझा एक सामान्य विधि हस्ताक्षर है।

public class Classy 
{ 
    public string FirstMethod<T1, T2>(string id, Func<T1, int, IEnumerable<T2>> del); 
    public string SecondMethod<T1, T2>(string id, Func<T1, int, IEnumerable<T2>> del);  
    public string ThirdMethod<T1, T2>(string id, Func<T1, int, IEnumerable<T2>> del); 

    // And so on... 
} 

और जेनरिक खाना पकाने:

// This is the Classy's shared method signature  
public delegate string classyDelegate<out T1, in T2>(string id, Func<T1, int, IEnumerable<T2>> filter); 


// And the linq-way to get the collection of delegates from Classy 
( 
    from method in typeof(Classy).GetMethods(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.NonPublic) 
    let delegateType = typeof(classyDelegate<,>) 
    select Delegate.CreateDelegate(delegateType, method) 
).ToList(); 

लेकिन Delegate.CreateDelegate(delegateType, method) एक ArgumentException त्रुटि विधि को लक्षित करने के लिए बाध्य कह फेंकता है। :/

मैं क्या गलत कर रहा हूं?

उत्तर

16

ऐसा इसलिए है क्योंकि Delegate.CreateDelegate का अधिभार केवल स्थैतिक तरीकों को इंगित करने वाले प्रतिनिधियों को बनाने का समर्थन करता है। यदि आप उदाहरण विधियों से जुड़ना चाहते हैं, तो आपको उस उदाहरण को भी पारित करने की आवश्यकता है जिस पर आपके बनाए गए प्रतिनिधि को विधि को कॉल करना है।

आप शायद चाहते हैं:

from method in typeof(Classy).GetMethods(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.NonPublic) 
let delegateType = typeof(classyDelegate<,>) 
select Delegate.CreateDelegate(delegateType, yourInstance, method) 

इसके अलावा, अपने कोड उदाहरण संकलन नहीं होंगे। आप विधि हस्ताक्षर पर भिन्नता घोषित नहीं कर सकते; और आप एक गैर-सारणी वर्ग में कार्यान्वयन को छोड़ नहीं सकते हैं।

अंत में, प्रतिनिधि। क्रेतेडिलेगेट एक प्रतिनिधि उदाहरण बनाता है, जो इसके प्रकार पैरामीटर को जानने के बिना अस्तित्व में नहीं हो सकता है। इसलिए, आप classyDelegate <,> से जुड़ नहीं सकते हैं, आपको शामिल वास्तविक प्रकारों को जानने की आवश्यकता है।

+0

हाय ड्राइविस! आपकी प्रतिक्रिया के लिए धन्यवाद। 'आप विधि हस्ताक्षर पर भिन्नता घोषित नहीं कर सकते' के साथ क्या मतलब है? – SDReyes

+3

वह आपके सामान्य तर्कों पर 'आउट' और 'इन' कीवर्ड का अर्थ है। – gix

+1

मेरा मतलब है कि कक्षा में आपके विधि हस्ताक्षर पर आपके पास और संशोधक नहीं हो सकते हैं। आप केवल उन्हें प्रतिनिधि और इंटरफ़ेस घोषणाओं पर ही प्राप्त कर सकते हैं। – driis

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