2012-01-01 22 views
6

में परिभाषित जेनेरिक तर्कों के साथ एक गैर सामान्य विधि को आमंत्रित करें यहां मेरा मुद्दा है;एक सामान्य वर्ग

public class MyClass<T> 
{ 
    public void DoSomething(T obj) 
    { 
     .... 
    } 
} 

मैं क्या है:

var classType = typeof(MyClass<>); 
Type[] classTypeArgs = { typeof(T) }; 
var genericClass = classType.MakeGenericType(classTypeArgs); 
var classInstance = Activator.CreateInstance(genericClass); 
var method = classType.GetMethod("DoSomething", new[]{typeof(T)}); 
method.Invoke(classInstance, new[]{"Hello"}); 

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

अगर मैं विधि सामान्य यह एक अपवाद के साथ फिर से विफल रहता है बनाने की कोशिश: MakeGenericMethod केवल एक विधि पर कहा जा सकता है, जिसके लिए MethodBase.IsGenericMethodDefinition सच है।

मुझे विधि कैसे शुरू करनी चाहिए?

उत्तर

11

आप गलत ऑब्जेक्ट पर GetMethod पर कॉल कर रहे हैं। बाध्य जेनेरिक प्रकार के साथ इसे कॉल करें और इसे काम करना चाहिए। यहां एक पूर्ण नमूना है जो ठीक से काम करता है:

using System; 
using System.Reflection; 

internal sealed class Program 
{ 
    private static void Main(string[] args) 
    { 
     Type unboundGenericType = typeof(MyClass<>); 
     Type boundGenericType = unboundGenericType.MakeGenericType(typeof(string)); 
     MethodInfo doSomethingMethod = boundGenericType.GetMethod("DoSomething"); 
     object instance = Activator.CreateInstance(boundGenericType); 
     doSomethingMethod.Invoke(instance, new object[] { "Hello" }); 
    } 

    private sealed class MyClass<T> 
    { 
     public void DoSomething(T obj) 
     { 
      Console.WriteLine(obj); 
     } 
    } 
} 
+0

बिल्कुल सही! यह मेरे घंटों के लिए stumped था .... – CRG

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