将动态转换为列表

本文关键字:列表 动态 转换 | 更新日期: 2023-09-27 18:27:07

private static void GetData()
{
   dynamic dynamicList =FetchData();
   FilterAndSortDataList(dynamicList);
}
private static void FilterAndSortDataList<T>(List<T> dataList)
{
    ...
}

当我调用过滤器和排序数据列表时,我收到运行时绑定错误。有没有办法在运行时将我的动态列表转换为List<T>

请注意,FetchData(( 是由插件暗示的,所以我事先不知道 T 类型是什么。

将动态转换为列表<T>

我认为它没有理由失败,除非FetchData数据不正确。

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

可能性二: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 或不是可枚举的,它会抛出它比某些运行时绑定错误更有意义。

有没有办法在运行时将我的动态列表转换为列表

我不知道为什么当它必须是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)
{
    ...
}