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

Dis*_*tum 4 .net c# 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);
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ell 5

你不能在反射代码中这样做,因为在你所讨论的反射代码中object,并没有盒装的东西Nullable<T> - 它是盒装底层值,或者是null.

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

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

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