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);