2011-08-12 14 views
6

में प्रतिनिधि प्रकार बनाएं I अभिव्यक्ति वर्ग का उपयोग करके प्रतिनिधि प्रकार बनाने का प्रयास करें, लेकिन जब मैं MethodInfo के उदाहरण से प्रतिनिधि बनाने का प्रयास करता हूं तो मुझे एक ArgumentException मिला है। मैं का उपयोग कर .NET 4.0 यहाँ कोड:रनटाइम

 var method = /*...*/; 
     List<Type> tArgs = new List<Type> { method.ReturnType }; 
     var mparams = method.GetParameters(); 
     mparams.ToList().ForEach(p => tArgs.Add(p.ParameterType)); 
     var delDecltype = Expression.GetDelegateType(tArgs.ToArray()); 
     return Delegate.CreateDelegate(delDecltype, method); 

पी.एस. मेरे खराब अंग्रेजी के लिए खेद है;)

+1

अपवाद का संदेश क्या है? – svick

+0

क्या [यह] (http://stackoverflow.com/questions/2714989/delegate-createdelegate-and-generics-error-binding-to-target-method/2715050#2715050) आपकी समस्या का समाधान है? – adrianbanks

उत्तर

11

यदि आप the documentation for Expression.GetDelegateType() पढ़ते हैं, तो आप देखेंगे कि वापसी का प्रकार अंतिम तर्क होना चाहिए।

इसका मतलब है कि इस कोड को काम करना चाहिए:

var tArgs = new List<Type>(); 
foreach (var param in method.GetParameters()) 
    tArgs.Add(param.ParameterType); 
tArgs.Add(method.ReturnType); 
var delDecltype = Expression.GetDelegateType(tArgs.ToArray()); 
return Delegate.CreateDelegate(delDecltype, method); 

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

return Delegate.CreateDelegate(delDecltype, instance, method); 
+0

यह मदद नहीं की है। वही अपवाद: ArgumentException "अंतिम विधि से लिंक करते समय त्रुटि।" –

+0

संपादित देखें, आपके पास शायद इंस्टेंस विधि है, जिसका अर्थ है कि आपको इंस्टेंस प्रदान करने की आवश्यकता है। – svick