我使用反射来遍历对象的属性。对于Nullable<>
类型,使用PropertyType
属性正在返回类型。然而,当我调用属性getter(通过PropertyType.GetGetMethod().Invoke(obj, new object[0])
或PropertyType.GetValue(obj, null)
,结果的类型是展开的原始的,未Nullable<>
。对于原因的,我宁愿去成,我需要把这个结果转换成其Nullable<>
类型,这将引发InvalidCastException
在这种情况下:C#:动态转换基元为Nullable <>
Convert.ChangeType(property.GetValue(obj, null), property.PropertyType);
有另一种方式,以确保该属性值的类型总是相同属性的类型
“对于原因的,我宁愿不进入” - 完全取决于你,当然,但你问什么**就不能存在** - 也许你可以添加一些上下文(更改名称,如果你喜欢 - 我们不会知道或关心),我们可能会提出一个更好的选择。 –
如果您确实必须知道,我将从Java到XML的XML编码器移植到C#中。我不会用另一个取代它们 - 两者都会存在并得到维护,所以我试图尽量减少它们之间的差异。我有一个'IDictionary'('IConverter'是我的),它充当属性类型的属性值转换器的注册表。由于我有这个问题,它打破了'可空'的问题。 –
我使用'MakeGenericType'到所有注册的两倍的初始注册后写的代码的简要位 - 即,对于每个'type',添加相同的转换器对'typeof运算(可空<>)MakeGenericType(类型)' –