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

Ron*_*rby 4 .net generics reflection

如何直到运行时才能转换IEnumerableIEnumerable<T>T?

我有一个绝对需要IEnumerable<T>一个方法,直到运行时才知道T,并且T必须是实际类型而不是像对象一样的祖先类型.

我打赌反射API允许这样的东西,但我不确切知道如何.

更新

我可以得到这样的类型对象:

var first = results.Cast<object>().FirstOrDefault();
if (first != null)
{
    var type = first.GetType();

}
Run Code Online (Sandbox Code Playgroud)

UPDATE2

我所指的"方法"实际上是WPF DataGrid的ItemSource属性的Setter.我遇到的问题是,如果我没有传递它IEnumerable<T>,那么Datagrid中生成的行都是空白的,就好像它反映属性的方法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.
        }

    }
Run Code Online (Sandbox Code Playgroud)

Tho*_*que 7

var elementType = ...
var results = ...
var castMethod = typeof(Enumerable).GetMethod("Cast").MakeGenericMethod(elementType);
var genericResults = castMethod.Invoke(null, new[] { results });
Run Code Online (Sandbox Code Playgroud)

genericResults变量是指类型的对象IEnumerable<T>(这里T是由表示的类型elementType变量).但请记住,静态,genericResults仍然是类型object; 没有办法告诉编译器它是一个IEnumerable<T>,因为T静态不知道.