[英]Invoke a generic method with a subtype of the generic parameter type
我正在尝试使用泛型参数类型的子类型通过反射调用泛型方法。 这是情况:
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 });
我得到一个例外,基本上说:
无法将类型“ConcreteClass”转换为类型“MyClass`[ConcreteClass]”
异常消息非常清楚,但是我似乎没有找到如何实现我所追求的目标。
编辑:
我试图实现的等效编译时间是:
Caller.Do(new ConcreteClass());
哪个编译得很好。
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 });
您的基于反射的代码正在尝试等效于Caller.Do<ConcreteClass>(instance, Type.Missing)
的运行时。
这是无效的。 方法Do<>
需要匹配类型 - 对于Do<ConcreteClass>
,您需要一个实例,它是MyClass<ConcreteClass>
的子类。
ConcreteClass
是MyClass<string>
的子类。 为此,您需要调用Do<string>(instance)
,或者整体Caller.Do<string>(instance, Type.Missing)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.