当类型参数在编译时未知,而是在运行时动态获取时,调用泛型方法的最佳方式是什么?
考虑以下示例代码 - 在 Example()
中方法,调用 GenericMethod<T>()
最简洁的方法是什么?使用 Type
存储在 myType
变量?
public class Sample
{
public void Example(string typeName)
{
Type myType = FindType(typeName);
// What goes here to call GenericMethod<T>()?
GenericMethod<myType>(); // This doesn't work
// What changes to call StaticMethod<T>()?
Sample.StaticMethod<myType>(); // This also doesn't work
}
public void GenericMethod<T>()
{
// ...
}
public static void StaticMethod<T>()
{
//...
}
}
您需要使用反射来获取开始的方法,然后通过使用 MakeGenericMethod 提供类型参数来“构造”它:
MethodInfo method = typeof(Sample).GetMethod(nameof(Sample.GenericMethod));
MethodInfo generic = method.MakeGenericMethod(myType);
generic.Invoke(this, null);
对于静态方法,将null
作为第一个参数传递给Invoke
。这与泛型方法无关 - 这只是正常的反射。
如前所述,从 C# 4 开始,使用 dynamic
很多事情都变得更简单了——当然,如果您可以使用类型推断。它在类型推断不可用的情况下没有帮助,例如问题中的确切示例。
我是一名优秀的程序员,十分优秀!