我有那个代码:
myDataGrid
是传递给方法的对象。我知道它是 OvserveableCollection
的类型不同类型的。
我只需要将该对象转换为 OvserveableCollection<T>
(它实现了 IEnumerable
接口(interface))
//get element's type
Type entryType = (myDataGrid as IEnumerable).AsQueryable().ElementType;
foreach (var item in (IEnumerable<entryType>)myDataGrid)
{}
但是编译器不知道 entryType
在循环标题中。为什么?
最佳答案
您不能使用运行时 Type
实例作为泛型类型参数,除非您使用反射 ( MakeGenericMethod()
/MakeGenericType()
)。但是我怀疑它是否有帮助!在这种情况下,要么使用非通用 IEnumerable
(没有 <T>
)API,或者可能转换为已知的接口(interface)/子类,或者使用 dynamic
作为最后的手段鸭子打字。
您也可以使用MakeGenericMethod()
等等,但这更复杂,而且几乎肯定更慢。
例如:
foreach(object item in (IEnumerable)myDataGrid)
{
// tada!
}
另一个技巧是使用 dynamic
调用通用代码:
public void Iterate<T>(IEnumerable<T> data)
{
foreach(T item in data) {...}
}
...
dynamic evil = myDataGrid;
Iterate(evil);
关于C# 类型转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6571241/