调用运行时确定类型的泛型方法
尝试调用编译时类型参数未知的泛型方法时会出现此问题。普通方法调用依赖于编译器执行的类型安全检查,但是当类型仅在运行时可用时,需要替代方法。
基于反射的解决方案
在提供的代码示例的上下文中:
public void Method<T>() where T : class {} public void AnotherMethod() { ... foreach (var interface in interfaces) { Method<interface>(); // Compile error! } }
绕过编译时类型检查:
使用 Type.GetMethod 检索开放泛型方法:
MethodInfo method = typeof(Test).GetMethod("Method");
使方法泛型与MakeGenericMethod:
MethodInfo genericMethod = method.MakeGenericMethod(interface);
使用 Invoke 调用方法
:genericMethod.Invoke(null, null); // No target or arguments in this case
完全的示例
为了阐明该过程,请考虑此修订后的代码示例:using System; using System.Linq; using System.Reflection; namespace Sample { interface IFoo { } interface IBar { } class Program { public static void CallMe<T>() { Console.WriteLine("Type of T: {0}", typeof(T)); } static void Main() { var types = typeof(Program).Assembly.GetTypes().Where(t => t.Namespace == "Sample"); var methodInfo = typeof(Program).GetMethod("CallMe"); foreach (var type in types) { var genericMethodInfo = methodInfo.MakeGenericMethod(type); genericMethodInfo.Invoke(null, null); } } } }
以上是如何调用具有运行时确定类型的泛型方法?的详细内容。更多信息请关注PHP中文网其他相关文章!