繁体   English   中英

将动态转换为List <T>

[英]Cast dynamic to List<T>

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

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

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

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

除非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或者不是可枚举的,则抛出哪个赋予它比某些运行时绑定错误更好的含义。

有没有办法在运行时将我的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)
{
    ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM