繁体   English   中英

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

[英]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>的子类。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM