C#:将原语动态转换为Nullable<>

时间:2011-12-13 11:35:32

标签: c# .net reflection

我正在使用反射来迭代对象的属性。对于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);

还有另一种方法可以确保属性值的类型始终与属性的类型相同吗?

1 个答案:

答案 0 :(得分:5)

您无法在反射代码中执行此操作,因为在反射代码中,您正在讨论object,并且不会像装箱Nullable<T>那样 - 它或者是盒装底层价值,或null

如果您知道实际类型,则可以使用构造函数创建包装值,但必须仅分配给Nullable<T>的类型字段/变量 - 而不是{ {1}} - 否则CLI会再次展开它。

但是,出于同样的原因,你在使用反射时不需要它被包装;任何像object这样的代码都会接受SetValue,并会做正确的事情;无论是object还是盒装底层值,它都将被正确处理。

基本上,在装箱和取消装箱null时,CLI会对问题无效进行特殊处理。