2015-10-15 129 views
2

我有一个泛型如下。在C#运行时使用反射调用ToList()方法#

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.我说得对不对这么远?

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

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

我的能量不足,非常有帮助。

+0

@Hani,你有点迷惑: 'Enumerable'是一个包含'IEnumerable '的扩展方法的类。另外[msdn说,_Enumerable ** does **有ToList()_](https://msdn.microsoft.com/en-us/library/bb342261(v = vs.110).aspx) – Grundy

+0

混合泛型和反射通常是一种代码异味 - 是否没有办法在您的情况下一般地调用“ToList”? –

+0

@Grundy你感到困惑 - OP通过反射在'Enumerable'上调用'ToList'。 –

回答

4

第一个参数[至Invoke]应该是类型为PaginatedList的对象吧?

ToListEnumerable一个静态方法,它接受一个IEnumerable<T>,因为它是唯一的参数:

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

Invoke实例作为第一个参数和所述方法参数之后。对于静态方法,您可以使用null作为“实例”参数。

所以正确的语法会再

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

o将是List<T>类型的对象(但你不知道什么kniw是T在编译的时候,所以你可以不投的话)。

+0

现在我在调用过程中得到这个异常。 “'System.Reflection.MethodBase.Invoke(object,object [])'的最佳重载方法匹配有一些无效参数” – VivekDev

+0

@DDevDev现在就试试 - 我忘记了'Invoke'不使用'params',所以第二个参数必须作为数组传递。 –

+0

谢谢斯坦利。它的工作现在完美。因为我只需要选择一个,所以我会毫不犹豫地选择你的。 – VivekDev

1

列表<牛逼>有一个构造函数一个IEnumerable <牛逼>(这被称为ToList),这样你就可以通过编写以下simplyfy这个任务:

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

我的天啊,你的工作! – VivekDev

+0

这也是一个可爱的答案。 – VivekDev