奇怪但源代码
public class Processor<T> where T: class
{
...
private object WorkWithSubtype(IRequester nextRequester, Type type)
{
if (type.GetInterface("IList") != null)
{
var originalType = type.GetGenericArguments()[0];
var list = Activator.CreateInstance(type);
var method = typeof(Processor<>).GetMethod("GetObjects", BindingFlags.NonPublic | BindingFlags.Instance).MakeGenericMethod(originalType);
var resList = method.Invoke(this, new object[] { nextRequester });
typeof(List<>).GetMethod("AddRange").MakeGenericMethod(originalType).Invoke(list, new object[] { resList });
return list;
}
}
private IEnumerable<K> GetObjects<K>(IRequester requester) where K: class
{
...
//We can call method WorkWithSubtype in this method sometimes
}
}
我得到“无法对ContainsGenericParameters为true的类型或方法执行后期绑定操作。”例外情况是抛出'var resList = method.Invoke(this,new object [] {nextRequester});'。你能帮助我吗?提前谢谢!
答案 0 :(得分:5)
您有两个通用参数:一个用于Processor类;另一个是GetObjects方法。在创建泛型方法时,您为方法的类型参数提供了一个类型参数,但是您没有为类的泛型参数提供类型参数。
根据处理器类的用途,您可以尝试以下解决方案之一:
typeof(Processor<T>)
而不是使用反射来构建封闭的泛型类型我认为第二种最有可能是您正在寻找的东西:
var method = typeof(Processor<T>)
.GetMethod("GetObjects", BindingFlags.NonPublic | BindingFlags.Instance)
.MakeGenericMethod(originalType);
此外,AddRange
不是通用方法;相反,List<>
是泛型类型,因此:
typeof(List<>)
.MakeGenericType(originalType)
.GetMethod("AddRange")
.Invoke(list, new object[] { resList });
答案 1 :(得分:0)
您需要像这样使用MakeGenericType:
var method = typeof(Processor<>).MakeGenericType(typeof(T)).GetMethod("GetObjects", BindingFlags.NonPublic | BindingFlags.Instance).MakeGenericMethod(originalType);
同样在调用AddRange
方法时。
问题是List<string>.AddRange
与List<int>.AddRange
的方法不同,MakeGenericType将类型参数应用于类。 GetObjects仍然需要调用MakeGenericMethod,因为它具有与包含类(T)不同的泛型类型参数(K)。