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

本文关键字:Nullable 转换 原语 动态 | 更新日期: 2023-09-27 18:17:46

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

是否有另一种方法来确保属性值的类型始终与属性的类型相同?

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

您不能在反射代码中这样做,因为在反射代码中您谈论的是object,并且没有作为盒装的Nullable<T> -它要么是盒装的底层值,要么是null

如果你知道实际的类型,你可以使用构造函数来创建一个包装的值,但是它必须只能分配给一个类型字段/变量是Nullable<T>,而不是object,否则CLI会再次展开它。

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

基本上,CLI在装箱和拆箱Nullable<T>时有特殊的处理,使问题无效。