C# 泛型方法使用运行时类型执行
这很奇怪,但是源代码C# 泛型方法使用运行时类型执行,c#,.net,reflection,C#,.net,Reflection,这很奇怪,但是源代码 public class Processor<T> where T: class { ... private object WorkWithSubtype(IRequester nextRequester, Type type) { if (type.GetInterface("IList") != null) { var originalType = type.GetGenericArgu
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
}
}
公共类处理器,其中T:class
{
...
私有对象WorkWithSubtype(IRequester nextRequester,类型)
{
if(type.GetInterface(“IList”)!=null)
{
var originalType=type.GetGenericArguments()[0];
var list=Activator.CreateInstance(类型);
var method=typeof(Processor).GetMethod(“GetObjects”,BindingFlags.NonPublic | BindingFlags.Instance).MakeGenericMethod(originalType);
var resList=method.Invoke(这是一个新对象[]{nextRequester});
typeof(List).GetMethod(“AddRange”).MakeGenericMethod(originalType).Invoke(List,新对象[]{resList});
退货清单;
}
}
私有IEnumerable GetObjects(IRequester请求程序),其中K:class
{
...
//在这个方法中,我们有时可以调用WorkWithSubtype方法
}
}
我得到“不能对ContainsGenericParameters为true的类型或方法执行后期绑定操作”。异常在“var resList=method.Invoke(this,new object[]{nextRequester});”行引发。你能帮助我吗?提前谢谢 您有两个通用参数:一个用于Processor类;另一个用于GetObjects方法。在生成泛型方法时,您已经为方法的类型参数提供了类型参数,但尚未为类的泛型参数提供类型参数 根据processor类的用途,您可以尝试以下解决方案之一:
- 使用类型参数生成封闭泛型类型
- 使用
而不是使用反射来构建封闭的泛型类型typeof(Processor)
- 从类中删除类型参数
- 从方法中删除类型参数
var method = typeof(Processor<T>)
.GetMethod("GetObjects", BindingFlags.NonPublic | BindingFlags.Instance)
.MakeGenericMethod(originalType);
您需要像这样使用MakeGenericType:
var method = typeof(Processor<>).MakeGenericType(typeof(T)).GetMethod("GetObjects", BindingFlags.NonPublic | BindingFlags.Instance).MakeGenericMethod(originalType);
var method=typeof(Processor).MakeGenericType(typeof(T)).GetMethod(“GetObjects”,BindingFlags.NonPublic | BindingFlags.Instance”).MakeGenericMethod(originalType);
类似地,当您调用AddRange
方法时
问题在于
List.AddRange
与List.AddRange
不同,MakeGenericType将类型参数应用于类。GetObjects仍然需要调用MakeGenericMethod,因为它的泛型类型参数(K)与包含的类(T)不同。谢谢,你说得对,我很笨。我需要打印(Processot)。再次感谢。
var method = typeof(Processor<>).MakeGenericType(typeof(T)).GetMethod("GetObjects", BindingFlags.NonPublic | BindingFlags.Instance).MakeGenericMethod(originalType);