我使用反射来迭代对象的属性。对于Nullable<>
类型,使用PropertyType
属性正确返回类型。但是,当我调用属性getter(通过PropertyType.GetGetMethod().Invoke(obj, new object[0])
或PropertyType.GetValue(obj, null)
)时,结果的类型是未包装的原语,而不是Nullable<>
。出于我不想深入的原因,我需要将此结果转换为其Nullable<>
类型。在这种情况下会抛出一个InvalidCastException
:
Convert.ChangeType(property.GetValue(obj, null), property.PropertyType);
是否有另一种方法来确保属性值的类型始终与属性的类型相同?
您不能在反射代码中这样做,因为在反射代码中您谈论的是object
,并且没有作为盒装的Nullable<T>
-它要么是盒装的底层值,要么是null
。
如果你知道实际的类型,你可以使用构造函数来创建一个包装的值,但是它必须只能分配给一个类型字段/变量是Nullable<T>
,而不是object
,否则CLI会再次展开它。
SetValue
的代码都会接受object
,并且会做正确的事情;无论它是null
还是盒装的底层值,它都将被正确处理。
基本上,CLI在装箱和拆箱Nullable<T>
时有特殊的处理,使问题无效。