如何从.net中的数组类型获取数组项类型?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (49)

假设我有一个System.String[]类型对象。我可以查询类型对象来确定它是否是一个数组

Type t1 = typeof(System.String[]);
bool isAnArray = t1.IsArray; // should be true

但是,我如何从t1获取数组项的类型对象

Type t2 = ....; // should be typeof(System.String)
提问于
用户回答回答于

可以Type.GetElementType为此使用实例方法。

Type t2 = t1.GetElementType();

[返回]当前数组,指针或引用类型包含或引用的对象的类型;如果当前的类型不是数组或指针,或者不是通过引用传递,或者表示泛型类型或泛型类型或泛型方法定义中的类型参数。

用户回答回答于

作为扩展方法:

public static class TypeHelperExtensions
{
    /// <summary>
    /// If the given <paramref name="type"/> is an array or some other collection
    /// comprised of 0 or more instances of a "subtype", get that type
    /// </summary>
    /// <param name="type">the source type</param>
    /// <returns></returns>
    public static Type GetEnumeratedType(this Type type)
    {
        // provided by Array
        var elType = type.GetElementType();
        if (null != elType) return elType;

        // otherwise provided by collection
        var elTypes = type.GetGenericArguments();
        if (elTypes.Length > 0) return elTypes[0];

        // otherwise is not an 'enumerated' type
        return null;
    }
}

用法:

typeof(Foo).GetEnumeratedType(); // null
typeof(Foo[]).GetEnumeratedType(); // Foo
typeof(List<Foo>).GetEnumeratedType(); // Foo
typeof(ICollection<Foo>).GetEnumeratedType(); // Foo
typeof(IEnumerable<Foo>).GetEnumeratedType(); // Foo

// some other oddities
typeof(HashSet<Foo>).GetEnumeratedType(); // Foo
typeof(Queue<Foo>).GetEnumeratedType(); // Foo
typeof(Stack<Foo>).GetEnumeratedType(); // Foo
typeof(Dictionary<int, Foo>).GetEnumeratedType(); // int
typeof(Dictionary<Foo, int>).GetEnumeratedType(); // Foo, seems to work against key

扫码关注云+社区