Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:将原语动态转换为可为null的<&燃气轮机;_C#_.net_Reflection - Fatal编程技术网

C#:将原语动态转换为可为null的<&燃气轮机;

C#:将原语动态转换为可为null的<&燃气轮机;,c#,.net,reflection,C#,.net,Reflection,我使用反射来迭代对象的属性。对于Nullable类型,使用PropertyType属性正确返回类型。但是,当我调用属性getter时(通过PropertyType.getMethod().invoke(obj,新对象[0])或PropertyType.GetValue(obj,null),结果的类型是未包装的原语,而不是null。出于我不想进入的原因,我需要将此结果转换为其null类型。在这种情况下,这会引发InvalidCastException: Convert.ChangeType(pro

我使用反射来迭代对象的属性。对于
Nullable
类型,使用
PropertyType
属性正确返回类型。但是,当我调用属性getter时(通过
PropertyType.getMethod().invoke(obj,新对象[0])
PropertyType.GetValue(obj,null)
,结果的类型是未包装的原语,而不是
null
。出于我不想进入的原因,我需要将此结果转换为其
null
类型。在这种情况下,这会引发
InvalidCastException

Convert.ChangeType(property.GetValue(obj, null), property.PropertyType);

有没有其他方法可以确保属性值的类型始终与属性的类型相同?

在反射代码中无法做到这一点,因为在反射代码中,您谈论的是对象,并且没有装箱的
可为空的
-它是装箱的基础值或

如果您知道实际类型,则可以使用构造函数创建包装值,但必须将其仅分配给可
为空的类型字段/变量,而不是
对象
,否则CLI将再次将其展开

但是,出于同样的原因,在使用反射时不需要对其进行包装;任何像
SetValue
这样的代码都将接受
对象
,并将做正确的事情;无论它是
null
还是装箱的基础值,都将正确处理


基本上,当装箱和取消装箱时,CLI有特殊的处理方式,这使得问题无效。

“出于原因,我不想讨论”-当然,这完全取决于您,但您要求的内容不可能存在-也许您可以添加一些上下文(如果您愿意,请更改名称-我们不知道或不关心),我们也许可以建议一个更好的选择。如果你真的必须知道,我正在将一个XML编码器从Java移植到C#。我不会用另一个替换它-两者都会存在并得到维护,所以我正在尝试最小化它们之间的差异。我有一个
IDictionary
IConverter
是我的)它充当属性类型到属性值转换器的注册表。由于这个问题,它正在为
null
s中断。我将在初始注册后编写一段简短的代码,使用
MakeGenericType
将所有注册翻倍-即,对于每个
类型
,添加相同的转换器
typeof(Nullable)。MakeGenericType(type)
谢谢你的回答。关于C#中的装箱,我还有一点需要学习。因为我需要将类型作为
IDictionary
键,并且我知道我所有的原语都包装在
Nullable
中,所以我稍微改变了设计,使用
(obj.GetType().IsValueType?typeof)创建了一个类型(Nullable).MakeGenericType(new[]{obj.GetType()}):obj.GetType())
作为键。它现在可以工作了。@SteveTaylor注意到反射级别(
MakeGenericType
等)非常慢;适合适度使用,但如果这是一个紧密的循环,您可能需要对其进行一些优化……谢谢提示。dotTrace是我的朋友。:)