在C#中访问非泛型类型

时间:2016-07-22 12:12:52

标签: 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()是我正在寻找的功能的占位符。

1 个答案:

答案 0 :(得分:6)

使用Type.GetGenericTypeDefinition()方法。它将返回类型的通用定义,例如来自List<>的{​​{1}}。然后,您可以使用Type.MakeGenericType(params Type[] typeArguments)方法创建一个包含所需通用参数的类型:

List<Whatever>

变量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>) 包含您要实现的目标。