在C#中运行时使用反射调用ToList()方法

时间:2015-10-15 17:42:18

标签: c# generics reflection

我的通用如下。

public class PaginatedList<T> : List<T>
{...}

我只想在运行时使用反射在该对象上调用ToList()方法。

有人可以帮忙。

我来得这么远。

MethodInfo toListMethod = typeof(Enumerable).GetMethod("ToList");
var constructedToList = toListMethod.MakeGenericMethod(TypeObjectOfT);
constructedToList.Invoke(paginatedListObject, null);

我在最后一行遇到异常,消息参数计数不匹配。我觉得前两个步骤没问题,因为我检查了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的对象的类型。

  2. Invoke方法调用似乎存在一些问题。传递null是否正确作为第二个参数?第一个参数应该是PaginatedList类型的对象吗?

  3. 我的精力充沛,非常友好。

2 个答案:

答案 0 :(得分:5)

  

第一个参数[to Invoke]应该是PaginatedList类型的对象吗?

ToListEnumerable上的静态方法,它仅使用IEnumerable<T>作为参数:

public static List<TSource> ToList<TSource>(
    this IEnumerable<TSource> source
)

Invoke实例作为第一个参数,然后使用方法参数。对于静态方法,可以使用null作为“instance”参数。

所以正确的语法是

object o = constructedToList.Invoke(null, new object[] {paginatedListObject});
然后

o将成为List<T>类型的对象(但是你不知道编译时T是什么,所以你不能把它强制转换。)

答案 1 :(得分:1)

列表与LT; T&GT;有一个构造函数,它采用IEnumerable&lt; T&gt; (在ToList中调用它),因此您可以通过编写以下内容来简单地完成此任务:

    var resul = Activator.CreateInstance(typeof(List<>).MakeGenericType(TypeObjectOfT), paginatedListObject);