使用泛型参数类型的子类型调用泛型方法

时间:2016-10-01 12:24:03

标签: c# generics reflection

我试图通过使用泛型参数类型的子类型的反射来调用泛型方法。情况如下:

public abstract class MyClass<T> where T : class
{
}

public static class Caller
{
    public static void Do<T>(MyClass<T> param1, string param2 = null) where T : class
    {

    }
}

public class ConcreteClass : MyClass<string>
{

}

然而,当我尝试做的时候:

ConcreteClass instance = Activator.CreateInstance(typeof(ConcreteClass));
MethodInfo methodInfo = typeof(Caller).GetMethod("Do");
methodInfo = methodInfo.MakeGenericMethod(typeof(ConcreteClass));
methodInfo.Invoke(null, new object[] { instance, Type.Missing });

我得到一个例外,主要是说:

  

无法转换类型&#39; ConcreteClass&#39;输入&#39; MyClass` [ConcreteClass]&#39;

异常信息非常明确,但我似乎无法找到如何实现我的目标。

编辑:

我想要实现的编译时间相当于:

Caller.Do(new ConcreteClass());

编译好。

2 个答案:

答案 0 :(得分:1)

ConcreteClass延长了MyClass<string>,因此您需要向typeof(string)提供MakeGenericMethod

ConcreteClass instance = (ConcreteClass)Activator.CreateInstance(typeof(ConcreteClass));
MethodInfo methodInfo = typeof(Caller).GetMethod("Do");
methodInfo = methodInfo.MakeGenericMethod(typeof(string));
methodInfo.Invoke(null, new object[] { instance, Type.Missing });

答案 1 :(得分:0)

您的基于反射的代码尝试运行时等效于Caller.Do<ConcreteClass>(instance, Type.Missing)

这是无效的。方法Do<>需要匹配类型 - 对于Do<ConcreteClass>,您需要一个或是MyClass<ConcreteClass>的子类的实例。

ConcreteClassMyClass<string>的子类。为此,您需要致电Do<string>(instance)或整体Caller.Do<string>(instance, Type.Missing)