private static void GetData()
{
dynamic dynamicList =FetchData();
FilterAndSortDataList(dynamicList);
}
private static void FilterAndSortDataList<T>(List<T> dataList)
{
...
}
当我调用FilterAndSortDataList时,我收到运行时绑定错误。有没有办法在运行时将我的dynamicList强制转换为List<T>
?
请注意,FetchData()是插件所支持的,所以我事先并不知道T是什么类型。
答案 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)
{
...
}