假设我在类或方法中有一个泛型成员,所以:
public class Foo<T>
{
public List<T> Bar { get; set; }
public void Baz()
{
// get type of T
}
}
当我实例化该类时, T
变为 MyTypeObject1
,因此该类具有通用列表属性: List<MyTypeObject1>
. 这同样适用于非泛型类中的泛型方法:
public class Foo
{
public void Bar<T>()
{
var baz = new List<T>();
// get type of T
}
}
我想知道,我的类列表包含什么类型的对象 . 所以名为 Bar
的列表属性或局部变量 baz
包含什么类型的 T
?
我不能做 Bar[0].GetType()
,因为列表可能包含零元素 . 我该怎么做?
16 回答
如果您不需要整个Type变量并且只想检查类型,则可以轻松创建临时变量并使用is运算符 .
尝试
如果您想知道属性的基础类型,请尝试以下方法:
必须在实例的基类型上设置
GetGenericArgument()
方法(其类是通用类myClass<T>
) . 否则,它返回一个类型[0]例:
您可以从任何实现IEnumerable <T>的集合类型中获取“T”类型,具体如下:
请注意,它不支持两次实现IEnumerable <T>的集合类型,例如
我想如果你需要支持这个,你可以返回一系列类型......
此外,如果您正在执行此操作(例如,在循环中),您可能还希望缓存每个集合类型的结果 .
您可以使用此选项重新运行通用列表类型 .
如果我理解正确,您的列表与容器类本身具有相同的类型参数 . 如果是这种情况,那么:
如果您处于将
object
作为类型参数的幸运情况,请参阅Marc's answer .考虑一下:我用它以相同的方式导出20个类型列表:
我使用这种扩展方法来完成类似的事情:
你这样使用它:
这不是你想要的,但它有助于展示所涉及的技术 .
这就是我做到的
然后这样称呼它
要么
类型:
使用3dGrabber的解决方案:
使用以下扩展方法,您可以在没有反射的情况下逃脱:
或者更一般:
用法:
这对我有用 . myList是一些未知的列表 .
(注意:我假设你所知道的只是
object
或IList
或类似的,并且列表在运行时可以是任何类型)如果你知道它是
List<T>
,那么:另一种选择是查看索引器:
使用新的TypeInfo: