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