为什么Type.GetElementType返回null?

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

我有以下代码:

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

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

谢谢

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

GetElementType()返回数组的元素类型。 List不是数组类型,因此没有“元素类型”。

如果你想得到随机IEnumerable产生的元素类型,试试这样的:

 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); } 

请注意,类型可以实现同一通用接口的多个版本; 例如,类型可以实现IEnumerableIEnumerable 。 你如何处理这种情况取决于你。 我提供的方法将采用运行时首先提供的任何接口类型。


请参阅ideone上使用上述方法的示例。