【发布时间】:2017-03-16 00:40:00
【问题描述】:
我有一个泛型如下。
public class PaginatedList<T> : List<T>
{...}
我只是想在运行时使用反射在该对象上调用 ToList() 方法。
有人可以帮忙吗。
我才来这么远。
MethodInfo toListMethod = typeof(Enumerable).GetMethod("ToList");
var constructedToList = toListMethod.MakeGenericMethod(TypeObjectOfT);
constructedToList.Invoke(paginatedListObject, null);
I get exception 在最后一行显示消息,Parameter count mismatch。我觉得前两步没问题,因为我检查了toListMethod.ToString()和constructedToList.ToString()。他们给了我以下输出,我觉得是正确的。
System.Collections.Generic.List`1[TSource] ToList[TSource](System.Collections.Generic.IEnumerable`1[TSource])
System.Collections.Generic.List`1[AvbhHis.BL.Entities.PatientCategory] ToList[PatientCategory](System.Collections.Generic.IEnumerable`1[AvbhHis.BL.Entities.PatientCategory])
问题: 1. 到目前为止我是对的吗?
MakeGenericMethod()方法的参数应该是什么。在我的例子中,它是运行时类型 T 对象的实例类型。Invoke 方法调用似乎有问题。传递 null 作为第二个参数是否正确?第一个参数应该是 PaginatedList 类型的对象吧?
我的精力已经耗尽,请帮忙。
【问题讨论】:
-
@Hani,你有点困惑:
Enumerable是一个包含IEnumerable<T>扩展方法的类。还有msdn say that Enumerable does have ToList() -
混合泛型和反射通常是一种代码味道 - 在您的情况下,有没有办法一般调用
ToList? -
@Grundy 你很困惑 - OP 正在通过反射在
Enumerable上调用ToList。 -
@DStanley,是的 :-) 可能我不太理解之前的评论 Hani :-)
-
重点是 ToList 不是扩展方法,而是 IEnumerable 上的方法。它是扩展类上的静态方法,以 IENumerable 作为其第一个参数
标签: c# generics reflection