.NET

2011-06-01 10 views
33

में प्रतिबिंब का उपयोग कर जेनेरिक विधि को कॉल करना मेरे पास एक प्रश्न है। क्या .NET में प्रतिबिंब का उपयोग करके जेनेरिक विधि को कॉल करना संभव है? मैं निम्नलिखित कोड.NET

var service = new ServiceClass(); 
Type serviceType = service.GetType(); 
MethodInfo method = serviceType.GetMethod("Method1", new Type[]{}); 
method.MakeGenericMethod(typeof(SomeClass)); 
var result = method.Invoke(service, null); 

की कोशिश की लेकिन यह निम्न अपवाद फेंकता है "देर बाध्य आपरेशन प्रकार या तरीकों जिसके लिए ContainsGenericParameters सच है पर नहीं किया जा सकता।"

उत्तर

86

आप MakeGenericMethod के परिणाम का उपयोग नहीं कर रहे हैं - जो उस विधि को नहीं बदलता है जिसे आप इसे कॉल करते हैं; यह एक और वस्तु का निर्माण विधि का प्रतिनिधित्व करता है। आपके पास कुछ होना चाहिए:

method = method.MakeGenericMethod(typeof(SomeClass)); 
var result = method.Invoke(service, null); 

(या निश्चित रूप से एक अलग चर का उपयोग करें)।

+0

बढ़िया! यह अब काम करता है। मेरी बदसूरत गलती ... – yshchohaleu

+0

मुझे यह समझने की एक ही सटीक समस्या नहीं थी कि 'MakeGenericMethod' एक कार्य है, एक शून्य विधि नहीं है, मुझे यकीन है कि यह ha_t का मुद्दा भी था। – Shimmy

+0

मैंने अभी भी वही गलती की है, लेकिन ऐसा इसलिए था क्योंकि मैंने MakeGenericMethod के परिणाम को असाइन करने के लिए लाइन डाली लेकिन उस नए लौटे हुए मूल्य का उपयोग करने के लिए इनवोकिंग कोड को बदलना भूल गया। – Charlie

2

आप कहने के लिए

method = method.MakeGenericMethod(typeof(SomeClass)); 
एक न्यूनतम भी पर

और अच्छा होगा यदि

var constructedMethod = method.MakeGenericMethod(typeof(SomeClass)); 
constructedMethod.Invoke(service, null); 

रूप MethodInfo के उदाहरण अपरिवर्तनीय हैं की जरूरत है।

यह

4 
3 

कंसोल पर मुद्रित करने के लिए पैदा कर रहा

string s = "Foo "; 
s.Trim(); 
Console.WriteLine(s.Length); 
string t = s.Trim(); 
Console.WriteLine(t.Length); 

रूप में एक ही अवधारणा है।

वैसे, अपने त्रुटि संदेश

"देर बाध्य आपरेशन प्रकार या तरीकों जिसके लिए ContainsGenericParameterstrue है पर नहीं किया जा सकता।"

यदि आपके सुराग method में अभी भी सामान्य पैरामीटर शामिल हैं।

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