繁体   English   中英

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

[英]C#: Dynamically convert primitive to Nullable<>

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

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

你不能在反射代码中做到这一点,因为在反射代码中你正在谈论object ,并且没有盒装的Nullable<T> 这样的东西 - 它既可以是盒装底层值,也可以是null

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

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

基本上,当装箱和取消装箱Nullable<T>时,CLI会有特殊处理,使问题无效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM