我有一个问题。是否可以在.NET中使用反射调用泛型方法? 我尝试了以下代码
var service = new ServiceClass();
Type serviceType = service.GetType();
MethodInfo method = serviceType.GetMethod("Method1", new Type[]{});
method.MakeGenericMethod(typeof(SomeClass));
var result = method.Invoke(service, null);
但它抛出以下异常“无法对ContainsGenericParameters为true的类型或方法执行后期绑定操作。”
答案 0 :(得分:98)
您没有使用MakeGenericMethod
的结果 - 这不会改变您调用它的方法;它返回另一个表示构造方法的对象。你应该有类似的东西:
method = method.MakeGenericMethod(typeof(SomeClass));
var result = method.Invoke(service, null);
(或者当然使用不同的变量)。
答案 1 :(得分:6)
你需要说
method = method.MakeGenericMethod(typeof(SomeClass));
最小值,最好是
var constructedMethod = method.MakeGenericMethod(typeof(SomeClass));
constructedMethod.Invoke(service, null);
因为MethodInfo
的实例是不可变的。
这与
的概念相同string s = "Foo ";
s.Trim();
Console.WriteLine(s.Length);
string t = s.Trim();
Console.WriteLine(t.Length);
使
4
3
在控制台上打印。
顺便提一下,你的错误信息
“无法对
ContainsGenericParameters
为true
的类型或方法执行后期绑定操作。”
如果您的线索method
仍包含通用参数。