我有一个方法,将输入参数作为类型的对象IEnumerable.我想枚举枚举,并为每个项目使用反射来获取每个属性的值.
我有以下代码:
protected void WriteData(IEnumerable data)
{
var enumerationTypeInfo = data.GetType();
var itemTypeInfo = enumerationTypeInfo.GetElementType();
...
}
Run Code Online (Sandbox Code Playgroud)
问题enumerationTypeInfo.GetElementType()始终是回归null.特别是,我正在List<Entry>进入WriteData,Entry我在哪里创建了一个类.当我使用调试器并设置断点时,我可以看到它enumerationTypeInfo正确显示它是一个类型列表Entry,但为什么会GetElementType返回null?
谢谢
cdh*_*wie 12
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);
}
Run Code Online (Sandbox Code Playgroud)
请注意,类型可以实现同一通用接口的多个版本; 一个类型可以同时实现IEnumerable<int>与IEnumerable<string>例如.你如何处理这种情况取决于你.我提供的方法将采用运行时首先提供的任何接口类型.
请参阅ideone上使用上述方法的示例.