将动态转换为List <t> </t>

时间:2013-08-09 16:03:48

标签: c# generics dynamic

private static void GetData()
{
   dynamic dynamicList =FetchData();
   FilterAndSortDataList(dynamicList);
}

private static void FilterAndSortDataList<T>(List<T> dataList)
{
    ...
}

当我调用FilterAndSortDataList时,我收到运行时绑定错误。有没有办法在运行时将我的dynamicList强制转换为List<T>

请注意,FetchData()是插件所支持的,所以我事先并不知道T是什么类型。

2 个答案:

答案 0 :(得分:3)

除非FetchData是不正确的数据,否则我认为没有理由失败。

可能性I:FetchData返回null,因此无法计算出类型参数(null在C#中没有类型)。

可能性II:FetchData未返回正确的List<T>对象。

我会重新设计像:

private static void GetData()
{
   dynamic dynamicList = FetchData();

   if (dynamicList is IEnumerable) //handles null as well
       FilterAndSortDataList(Enumerable.ToList(dynamicList));

   //throw; //better meaning here.
}

它检查返回的类型是否为IEnumerable(希望它是IEnumerable<T> - 我们无法检查它是否IEnumerable<T>本身,因为我们没有T它是一个不错的假设)在这种情况下我们将获得的序列转换为List<T>,以确保我们传递List<T>dynamic不会使用扩展方法,因此我们不得不调用Enumerable.ToList。如果dynamicList为null或不是可枚举,则抛出它会使其比某些运行时绑定错误更有意义。

答案 1 :(得分:0)

  

有没有办法在运行时将我的dynamicList强制转换为List

我不知道为什么当它必须是List<T>时将其声明为动态,但我猜这是因为你不知道T是什么。如果你做了,你可以直接投射它:

private static void GetData()
{
   dynamic dynamicList = new List<string> ();
   FilterAndSortDataList((List<string>)dynamicList);
}

private static void FilterAndSortDataList<T>(List<T> dataList)
{
    ...
}

但显然可能会在运行时失败。

另一种选择可能是GetData也是通用的:

private static void GetData<T>()
{
   List<T> list = new List<T>();
   FilterAndSortDataList(list);
}

private static void FilterAndSortDataList<T>(List<T> dataList)
{
    ...
}