如何使用反射调用泛型方法?

当类型参数在编译时未知,但在运行时动态获取时,调用泛型方法的最佳方法是什么

考虑以下示例代码-在Example()方法中,调用GenericMethod<T>()使用myType变量中存储的Type

公共类示例
{
公共void示例(字符串类型名)
{
类型myType=FindType(类型名称);
//这里什么叫做GenericMethod<T>()?
GenericMethod<myType>();//这不起作用
//调用StaticMethod<T>()有哪些更改?
Sample.StaticMethod<myType>();//这也不起作用
}
公共无效通用方法<T>()
{
// ...
}
公共静态无效静态方法<T>()
{
//...
}
}

您需要使用反射来获取要启动的方法,然后通过使用MakeGenericMethod提供类型参数来“构造”它:

MethodInfo-method=typeof(Sample.GetMethod)(nameof(Sample.GenericMethod));
MethodInfo generic=method.MakeGenericMethod(myType);
generic.Invoke(this,null);

对于静态方法,将null作为第一个参数传递给Invoke。这与泛型方法无关——它只是普通的反射

如前所述,对于C#4来说,使用动态,这一点要简单得多——当然,如果可以使用类型推断的话。在类型推断不可用的情况下,例如问题中的确切示例,它没有帮助

发表评论