我有那个代码:
myDataGrid是传递给方法的对象.我知道它是OvserveableCollection不同类型的类型.我只需要将该对象转换为OvserveableCollection<T>(它实现IEnumerable接口)
//get element's type
Type entryType = (myDataGrid as IEnumerable).AsQueryable().ElementType;
foreach (var item in (IEnumerable<entryType>)myDataGrid)
{}
Run Code Online (Sandbox Code Playgroud)
但是编译器不知道entryType循环头中的内容.为什么?
Type除非使用反射(MakeGenericMethod()/ MakeGenericType()),否则不能将运行时实例用作泛型类型参数.不过我怀疑它会有所帮助!在这种情况下,要么使用非泛型IEnumerable(无<T>)API,要么转换为已知的接口/子类,或者dynamic作为最后的手段使用duck-typing.
你也可以使用MakeGenericMethod()等,但这更复杂,几乎肯定更慢.
例如:
foreach(object item in (IEnumerable)myDataGrid)
{
// tada!
}
Run Code Online (Sandbox Code Playgroud)
另一个技巧可以是用来dynamic调用通用代码:
public void Iterate<T>(IEnumerable<T> data)
{
foreach(T item in data) {...}
}
...
dynamic evil = myDataGrid;
Iterate(evil);
Run Code Online (Sandbox Code Playgroud)