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