为什么类型.GetElementType返回null

本文关键字:null 返回 GetElementType 类型 为什么 | 更新日期: 2023-09-27 18:05:35

我有一个方法,它将类型为IEnumerable的对象作为输入参数。我想枚举枚举,并为每个项目使用反射来获取每个属性的值。

我有以下代码:

protected void WriteData(IEnumerable data)
{
    var enumerationTypeInfo = data.GetType();
    var itemTypeInfo = enumerationTypeInfo.GetElementType();
    ...
}

问题是enumerationTypeInfo.GetElementType()总是返回null。特别是,我将List<Entry>传递到WriteData,其中Entry是我创建的类。当我使用调试器并设置断点时,我可以看到enumerationTypeInfo正确显示它是Entry类型的列表,但是为什么GetElementType返回null ?

谢谢

为什么类型.GetElementType返回null

GetElementType()返回数组的元素类型。List<T>不是数组类型,因此没有"元素类型"。

如果您想获得随机IEnumerable<T>生成的元素类型,请尝试这样做:

public static Type GetEnumerableType(Type type)
{
    if (type == null)
        throw new ArgumentNullException("type");
    if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>))
        return type.GetGenericArguments()[0];
    var iface = (from i in type.GetInterfaces()
                 where i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEnumerable<>)
                 select i).FirstOrDefault();
    if (iface == null)
        throw new ArgumentException("Does not represent an enumerable type.", "type");
    return GetEnumerableType(iface);
}

注意类型可以实现同一个泛型接口的多个版本;例如,一个类型可以同时实现IEnumerable<int>IEnumerable<string>。你怎么处理这个案子取决于你自己。我提供的方法将采用运行时首先提供的接口类型。


GetElementType用于数组,而不是其他泛型类。要获取泛型类型的泛型参数,可以使用Type.GetGenericArguments