当<T> T 直到运行时才知道时,将 IEnumerable 转换为 IEnumerable



当T直到运行时才知道时,我如何将IEnumerable转换为IEnumerable<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>,在数据网格中生成的行都是空白的,好像它反映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是不知道静态的。

下面的代码为我工作:

    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("ToList").MakeGenericMethod(type);
            dynamic genericResults = castMethod.Invoke(null, new[] { results });
            Results = genericResults; // Results is a dependency property that DataGrid.ItemSource is bound to.
        }
    }        

相关内容

  • 没有找到相关文章

最新更新