我有一个类,我需要通过对象属性反映并检查值和其他内容。当我有一个列表并尝试将项目转换为 IEnumerable 时,一切似乎都工作异常。
if (propType.GetInterfaces().Contains(typeof(IEnumerable)))
{
var value = prop.GetValue(source);
Type underlyingType = propType.GetGenericArguments()[0];
var enumerable = value as IEnumerable<object>;
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]]"
底层类型返回为:
System.Int32
当它是自定义类列表时,这是有效的,当它是值类型时,它似乎会被破坏。
有人可以帮忙吗?
事实是int
是值类型在这里有所不同。根据 C# 规范,泛型类型之间必须存在引用或标识转换,以使类型可以进行变体转换:
A type T<A1, …, An>
可方差转换为类型T<B1, …, Bn>
if
T
是使用变体声明的接口或委托类型
类型参数T<X1, …, Xn>
,并且对于每个变体类型参数Xi
以下其中一项成立:
Xi
是协变的,并且存在隐式引用或身份转换Ai
to Bi
-
Xi
是逆变的,并且存在隐式引用或身份转换Bi
to Ai
-
Xi
是不变的,并且存在身份转换Ai
to Bi
IEnumerable<T>
是协变的,所以我标记的线很重要。Ai
你的情况是int
and Bi
is int
。没有参考转换int
to object
, 因为int
不是引用类型。这两者之间也不存在身份转换,因为它们并不相同。
我不知道你问题的全部背景,但你可以使用非通用IEnumerable
代替IEnumerable<object>
。它们几乎是一样的。但是,您可能在这里面临 XY 问题,因此如果不了解更多有关您的案例的信息,就很难为您提供帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)