通用容器中的类型
本文关键字:类型 | 更新日期: 2023-09-27 18:26:57
public T getValueByName<T>(String name)
{
if( T is List )
Object containedType = T.WhatGoesHere()?
...
在上面的代码中,我需要知道我是否可以将列表转换为传入的任何类型的列表,例如 List<Control>
.
有没有办法查询所包含类型的泛型? 我可以得到List<Control>
,List<String>
,List<Form>
等。
我可以拆分 API 以在传递包含类型的单独方法中返回列表,从而要求调用者对列表使用一种方法,对简单类型使用一种方法。 无论哪种方式,他们都必须知道会发生什么,但如果有一种流畅的方法来完成我所要求的,我宁愿保持 API 简单。
注意:这是缺少协方差的解决方案,因为即使在包含的类型上定义了隐式转换运算符,List 到 T 的强制转换也会失败。 因此,为了遵循从这里开始listOfB.Cast<A>();
的解决方案,我需要知道要投射什么(什么是 A(。
谢谢!
您可以从typeof(T)
开始获取表示T
的System.Type
实例。一旦有了它,你可以检查Type.IsGenericType
以查看它是否真的是一个泛型参数,然后调用Type.GetGenericArguments()
以查看使用了哪些泛型参数。
例如,如果T
List<int>
IsGenericType
将true
,GetGenericArguments()
将返回一个包含一个元素的数组:System.Int32
例如,这是我编写的代码片段,用于查看给定类型(变量 type
(是否是某种实现,如果IEnumerable<T>
T
未知。它首先必须查看它是否是一个泛型,然后确定它是否只有一个参数,确定所述参数并查看它是否实现了接口,给定该参数:
if (type.IsGenericType)
{
Type[] genericArguments = type.GetGenericArguments();
if (genericArguments.Length == 1)
{
Type proposedEnumerable = typeof(IEnumerable<>).MakeGenericType(genericArguments);
if (proposedEnumerable.IsAssignableFrom(type))
{
有关参考,请参阅:
- http://msdn.microsoft.com/en-us/library/system.type.isgenerictype(v=vs.110(.aspx
- http://msdn.microsoft.com/en-us/library/system.type.getgenericarguments(v=vs.110(.aspx