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

本文关键字:ToList 方法 调用 反射 运行时 | 更新日期: 2023-09-27 18:17:50

我有一个通用的如下。

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对象的实例类型。

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

  • 我没力气了,请帮忙。

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

    第一个参数[到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是什么,所以你不能强制转换它)。

    List<有一个构造函数,接受IEnumerable><(在ToList中调用),因此您可以通过编写以下内容来简化此任务:>

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