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

Viv*_*Dev 2 c# generics reflection

我有一个通用如下.

public class PaginatedList<T> : List<T>
{...}
Run Code Online (Sandbox Code Playgroud)

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

有人可以请帮助.

我来得这么远.

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

在最后一行收到异常消息,参数计数不匹配.我觉得前两个步骤都OK,因为我已经检查了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])
Run Code Online (Sandbox Code Playgroud)

问题: 1.我到目前为止是对的吗?

  1. MakeGenericMethod()方法的参数应该是什么.在我的例子中,它是运行时类型T的对象的类型.

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

我的能量已经消失了,所以请帮忙.

D S*_*ley 5

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

ToList是一个静态方法,Enumerable它采用一个IEnumerable<T>唯一的参数:

public static List<TSource> ToList<TSource>(
    this IEnumerable<TSource> source
)
Run Code Online (Sandbox Code Playgroud)

Invoke实例作为第一个参数,然后将方法参数作为参数.对于null用于"instance"参数的静态方法.

所以正确的语法是

object o = constructedToList.Invoke(null, new object[] {paginatedListObject});
Run Code Online (Sandbox Code Playgroud)

o然后将是一个类型的对象List<T>(但你不知道T编译时是什么,所以你不能投射它).