假设我有一个类型的实体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<>
from 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
包含您要实现的目标。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句