如何转换 IEnumerable
至 IEnumerable<T>
当 T 直到运行时才知道?
我有一个方法 绝对需要一个 IEnumerable<T>
其中 T 直到运行时才知道 和 T
必须是实际类型而不是像对象这样的祖先类型 .
我打赌反射 API 允许这样的事情,但我不知道到底是怎么做的。
更新
我可以得到一个这样的类型对象:
var first = results.Cast<object>().FirstOrDefault();
if (first != null)
{
var type = first.GetType();
}
更新2
我所指的“方法”实际上是 WPF DataGrid 的 ItemSource 属性的 Setter。
我遇到的问题是,如果我不通过
IEnumerable<T>
Datagrid中生成的行都是空白的,好像是反射(reflect)T
属性的方法不工作,它无法生成列。即使使用此代码也会产生这种不良影响:
public CollectionResultWindow(IEnumerable results)
{
Contract.Requires(results != null, "results is null.");
InitializeComponent();
DataContext = this;
var first = results.Cast<object>().FirstOrDefault();
if (first != null)
{
Type type = first.GetType();
var castMethod = typeof(Enumerable).GetMethod("Cast").MakeGenericMethod(type);
dynamic genericResults = castMethod.Invoke(null, new[] { results });
Results = genericResults; // Results is a dependency property that DataGrid.ItemSource is bound to.
}
}
最佳答案
var elementType = ...
var results = ...
var castMethod = typeof(Enumerable).GetMethod("Cast").MakeGenericMethod(elementType);
var genericResults = castMethod.Invoke(null, new[] { results });
genericResults
变量引用类型为 IEnumerable<T>
的对象(其中 T
是由 elementType
变量表示的类型)。但请记住,静态地,genericResults
仍然是 object
类型;没有办法告诉编译器它是 IEnumerable<T>
, 自 T
不是静态已知的。
关于.net - 当 T 直到运行时才知道时,将 IEnumerable 转换为 IEnumerable<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7108759/