2012-01-01 7 views
6

Aquí está mi problema;Invocar un método no genérico con argumentos genéricos definidos en una clase genérica

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

Lo que hice es:

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"}); 

En el caso anterior la excepción que recibo es: Late operaciones con destino no se pueden realizar en los tipos o métodos para el que ContainsGenericParameters es cierto.

Si trato de hacer que el método genérico vuelve a fallar con una excepción: MakeGenericMethod sólo pueden ser llamados en un método para el que MethodBase.IsGenericMethodDefinition es cierto.

¿Cómo debo invocar el método?

Respuesta

11

Está llamando al GetMethod en el objeto equivocado. Llámalo con el tipo genérico y debería funcionar. Aquí hay una muestra completa que funciona correctamente:

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

¡Perfecto! Esto tuvo mi perplejo por horas ... – CRG

Cuestiones relacionadas