C#运行时动态类型参数泛型方法的调用
在C#中使用泛型方法时,有时类型参数在编译时未知,而必须在运行时动态获取。本文探讨在这种情况下调用泛型方法的最佳实践。
考虑以下代码示例,其中Example
方法尝试使用从运行时变量myType
获取的类型参数调用泛型方法GenericMethod<T>
。
public class Sample { public void Example(string typeName) { Type myType = FindType(typeName); GenericMethod<myType>(); // 这行代码无法编译通过 StaticMethod<myType>(); // 这行代码也无法编译通过 } public void GenericMethod<T>() { // ... } public static void StaticMethod<T>() { // ... } }
如示例所示,直接尝试调用GenericMethod<myType>
是行不通的,因为编译器无法在编译时推断类型参数。为了解决这个问题,我们需要使用反射来获取方法,然后使用所需的类型参数来“构造”它。
MethodInfo method = typeof(Sample).GetMethod(nameof(Sample.GenericMethod)); MethodInfo generic = method.MakeGenericMethod(myType); generic.Invoke(this, null);
GetMethod
方法从当前类型中检索方法,而MakeGenericMethod
使用指定的类型参数构造泛型方法规范。最后,Invoke
用于调用构造的泛型方法。
对于静态方法,将null
作为第一个参数传递给Invoke
。这与泛型方法无关,只是反映了通过反射调用静态方法的方式。
在C# 4及更高版本中,如果类型推断是可能的,可以使用动态调用来进一步简化此过程,但这并非总是如此。通过反射提供的解决方案仍然是使用动态类型参数调用泛型方法的可靠方法。
以上是在运行时,如何使用动态类型参数调用C#中的通用方法?的详细内容。更多信息请关注PHP中文网其他相关文章!