访问C#中的非泛型类型

本文关键字:泛型类型 访问 | 更新日期: 2023-09-27 17:58:23

假设我有一个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 );

其中CCD_ 7是我正在寻找的功能的占位符。

访问C#中的非泛型类型

使用Type.GetGenericTypeDefinition()方法。它将返回一个类型的泛型定义,例如List<Whatever>中的List<>。然后,您可以使用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包含您试图实现的目标。