我试图通过使用泛型参数类型的子类型的反射来调用泛型方法。情况如下:
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());
编译好。
答案 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>
的子类的实例。
ConcreteClass
是MyClass<string>
的子类。为此,您需要致电Do<string>(instance)
或整体Caller.Do<string>(instance, Type.Missing)
。