reflection,将List 转换为IEnumerable
我有一个类,我需要通过对象属性反映并检查值和其他东西。 当我有一个列表并尝试将项目转换为IEnumerable时,一切似乎都有效。
if (propType.GetInterfaces().Contains(typeof(IEnumerable))) { var value = prop.GetValue(source); Type underlyingType = propType.GetGenericArguments()[0]; var enumerable = value as IEnumerable; if(enumerable == null) { // problem here...... } // Check the items in the list }
propType返回:
FullName =“System.Collections.Generic.List`1 [[System.Int32,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]”
underlyingType返回为:
System.Int32
当它是一个自定义类列表时,它就会工作,当它是一个值类型时,它似乎正在破坏。
有人可以帮忙吗?
int
是值类型的事实在这里有所不同。 根据C#规范,generics类型之间必须存在引用或标识转换,以使类型变量可转换:
类型
T
是方差可转换为类型T
如果T
是接口或使用变量类型参数T
声明的委托类型,并且对于每个变体类型参数Xi
,以下之一成立:
Xi
是协变的,并且从Ai
到Bi
存在隐式参考或身份转换Xi
是逆变的,并且从Bi
到Ai
存在隐式参考或身份转换Xi
是不变的,并且从Ai
到Bi
存在身份转换
IEnumerable
是协变的,因此我标记的行很重要。 在你的情况下Ai
是int
, Bi
是int
。 没有从int
到object
引用转换,因为int
不是引用类型。 这两者之间也没有身份转换,因为它们不一样。
我不知道你的问题的整个上下文,但你可以使用非通用IEnumerable
而不是IEnumerable
。 他们几乎是一样的。 但是,您可能在这里面临XY问题,因此在不了解您的情况的情况下很难帮助您。