c# - 恢复一个 "lost"类型的参数

标签 c# generics

基本上,我的问题是:是否有某种方法可以“恢复”因向上转换为非泛型基类型而丢失的类型参数,例如 Object .这是我的意思的一个例子:

假设我收到了一个 Object l来自图书馆,我知道 l是一个 IList<T> , 但我不知道 T (但我知道它是引用类型,没有值类型)。但是,T 的确切类型不重要,因为我只想通过l到通用方法:

void doSomethingWithList<T>(IList<T> l){ ... }

但是,我不能那样做,因为我不知道要转换成哪种类型 l ,即我想执行以下操作:

doSomethingWithList((IList<>)l);

我想告诉编译器 l是一个 IList它应该调用该方法并将未知类型参数绑定(bind)到它的参数 T .但它不是这样工作的。我有什么选择吗?我能否以某种方式将“丢失”类型参数的对象传递给泛型方法?

最佳答案

你可以使用反射来做到这一点:

var interfaceType = l.GetType().GetInterface("System.Collections.Generic.IList`1");
var itemType = interfaceType.GetGenericArguments()[0]; // This is your T
var method = this.GetType().GetMethod("doSomethingWithList").MakeGenericMethod(itemType);
method.Invoke(this, new object[] { l });

但如果可以的话,最好将 doSomethingWithList 更改为接受非通用列表...

关于c# - 恢复一个 "lost"类型的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24809792/

相关文章:

c# - Web API OData - 使用 ODataModelBuilder 公开 ComplexType

c# - 实现无锁队列(用于 Logger 组件)

c#.net 网络服务

java - 如何覆盖java中的泛型列表返回类型

java - 为什么通用类型参数说 "extends"Comparable 而不是 "implements"?

c# - 在强类型列表上尝试 "where"时出错,错误 CS0103

c# - DDD实体持久化场景

java - 通用静态工厂

java - 通用 java 函数使用的 "Class type"的 "type parameter"

java - 使用 Java 泛型的责任链处理程序