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

标签 .net generics reflection

如何转换 IEnumerableIEnumerable<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/

相关文章:

c# - 使代理/服务类更通用

java - 如何使用类名作为方法参数的类型

c# - 下载图像时异步/等待死锁

c# - 为什么 Entity Framework 为非常相似的代码创建不同的 sql 查询

java - 变量类型(通用或非通用)更改属性行为

java - 在没有警告的情况下转换泛型类型?

c# - 如何枚举传递的方法参数

c# - 您如何在TextBox C#中创建多角色

.net - 为什么 Task.WhenAll 上的等待不抛出 AggregateException?

Java通用 map