为什么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); }
请注意,类型可以实现同一通用接口的多个版本; 例如,类型可以实现IEnumerable
和IEnumerable
。 你如何处理这种情况取决于你。 我提供的方法将采用运行时首先提供的任何接口类型。
请参阅ideone上使用上述方法的示例。