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

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

调用 FilterAndSortDataList 时出现运行时绑定错误。有没有办法List<T>在运行时将我的 dynamicList 转换为?

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

4

2 回答 2

7

我看不出它为什么会失败,除非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 或它不是可枚举的,它会抛出,这比一些运行时绑定错误更有意义。

于 2014-01-17T13:54:27.530 回答
0

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

我不知道为什么当它必须是 a 时你将它声明为动态的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)
{
    ...
}
于 2013-08-09T16:09:41.390 回答