c# - 在 C# 中访问非泛型类型

标签 c# generics

假设我有一个 IList<MyClass> 类型的实体我想映射到 IList<MyMappedClass> 类型的列表同时保持相同的底层集合类型。

我的意思是如果实例恰好是 List<MyClass> 类型它应该映射到 List<MyMappedClass>ObservableCollection<MyClass>ObservableCollection<MyMappedClass> .

到目前为止我所做的是我可以像这样找到列表的通用类型:

Type listType = myList.GetType(); //myList type: List<T> or ObservableCollection<T>
Type listItemType = listType.GetGenericArguments()[0];

我知道我可以做到:

Type myListType = typeof(List<>).MakeGenericType(listItemType );

我不能那样做:

Type myListType = myList.GetType().MakeGenericType(listItemType );

因为它已经是通用的了。我正在寻找的是以下内容:

Type myListType = myList.GetType().GotNonGenericType().MakeGenericType(listItemType );

哪里GotNonGenericType()是我正在寻找的功能的占位符。

最佳答案

使用 Type.GetGenericTypeDefinition() 方法。它将返回类型的通用定义,例如List<>来自 List<Whatever> .然后你可以用 Type.MakeGenericType(params Type[] typeArguments) 创建一个带有你想要的通用参数的类型方法:

var list    = new List<int>();
var type    = myList.GetType();                        // ~ typeof(List<int>)
var generic = type.GetGenericTypeDefinition();         // ~ typeof(List<>)
var newType = generic.MakeGenericType(typeof(string)); // ~ typeof(List<string>)

变量 newType包含您想要实现的目标。

关于c# - 在 C# 中访问非泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38526152/

相关文章:

c# - 传输事件处理程序中的SynchronizationContext.Post(…)

c# - 在实现 IEnumerable 的类上序列化自定义属性

c# - 是什么阻止了我的异步函数设置中的主线程?

java - 泛型方法是否需要具有泛型类型参数才能正常工作?

javascript - 在 Windows 10 webView 中执行 js 脚本

c# - 是否可以创建可以在 C# 中多次嵌套泛型类型的流畅接口(interface)

java - 我可以避免使用 "generics"或更好的 "design patterns"进行显式转换吗?

c# - 为什么在我的新类(class)中创建事件时出现错误?

generics - `my_func<T: MyTrait>` 与 `my_func<T> where T: MyTrait` 之间的区别

Java 如何将泛型参数声明为任意接口(interface)