通用容器中的类型

本文关键字:类型 | 更新日期: 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)开始获取表示TSystem.Type实例。一旦有了它,你可以检查Type.IsGenericType以查看它是否真的是一个泛型参数,然后调用Type.GetGenericArguments()以查看使用了哪些泛型参数。

例如,如果T List<int> IsGenericTypetrueGetGenericArguments()将返回一个包含一个元素的数组: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