4

这很奇怪,但源代码

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 为真的类型或方法执行后期绑定操作。”。异常是在“var resList = method.Invoke(this, new object[] { nextRequester });”行抛出。你能帮助我吗?提前致谢!

4

2 回答 2

5

您有两个通用参数:一个用于处理器类;另一个用于 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 }); 
于 2012-04-16T19:58:14.960 回答
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)。

于 2012-04-16T19:59:23.757 回答