C# C"反思:";指针;转换为值类型
简短描述 我想知道是否有一个.NET特性允许我操作通过反射获得的值类型。因此,在对值类型属性调用PropertyInfo.getValue(…)时,我不希望获取副本,而是希望获取原始对象并对其进行操作 我不允许使用不安全的指针 详细描述 这个需求的产生是因为我正在实现一个Web服务,让我可以操作Unity3d场景图 场景图可能具有以下结构C# C"反思:";指针;转换为值类型,c#,reflection,unity3d,C#,Reflection,Unity3d,简短描述 我想知道是否有一个.NET特性允许我操作通过反射获得的值类型。因此,在对值类型属性调用PropertyInfo.getValue(…)时,我不希望获取副本,而是希望获取原始对象并对其进行操作 我不允许使用不安全的指针 详细描述 这个需求的产生是因为我正在实现一个Web服务,让我可以操作Unity3d场景图 场景图可能具有以下结构 游戏对象1 向量1.2 游戏对象2 结构2.1 向量2.2 客户端可以查询以下URI: 得到 这是可行的,因为它非常简单,只需通过反射遍历层次结构
- 游戏对象1
- 向量1.2
- 游戏对象2
- 结构2.1
- 向量2.2
foo.Position.X = 10;
var position = foo.Position;
position.X = 10;
foo.Position = position;
其中,Position
是类型为值类型的属性。您将得到一个编译时错误。相反,您需要的是:
foo.Position.X = 10;
var position = foo.Position;
position.X = 10;
foo.Position = position;
您可以通过反射来实现这一点——当然,假设有一个setter
请注意,当您在这里说“原始对象”时,对于值类型(存储在该类型的字段中,即未装箱)没有对象。只有值,作为字段作为另一个对象的一部分
因此,在对值类型属性调用PropertyInfo.getValue(…)时,我不希望获取副本,而是希望获取原始对象并对其进行操作
然后您需要访问字段,而不是属性。或者,您需要调用getter来检索值的副本,修改副本,然后调用setter来更改包含对象的状态
当你使用反射时,这不仅是正确的,一般来说也是正确的。你不能这样做:
foo.Position.X = 10;
var position = foo.Position;
position.X = 10;
foo.Position = position;
其中,Position
是类型为值类型的属性。您将得到一个编译时错误。相反,您需要的是:
foo.Position.X = 10;
var position = foo.Position;
position.X = 10;
foo.Position = position;
您可以通过反射来实现这一点——当然,假设有一个setter
请注意,当您在这里说“原始对象”时,对于值类型(存储在该类型的字段中,即未装箱)没有对象。只有值,作为字段作为另一个对象的一部分。谢谢。目前我正在做你描述的事情。调用getter,操纵值,然后调用setter。只是因为我处于对象/属性的层次结构中,所以我需要递归地调用层次结构链中所有更高层次的对象上的setter,这相当慢。但我想我还是坚持住了。@Marco:听起来你有多种可变值类型。这几乎总是个坏主意。如果您可以使用类来代替,我建议您这样做。谢谢。目前我正在做你描述的事情。调用getter,操纵值,然后调用setter。只是因为我处于对象/属性的层次结构中,所以我需要递归地调用层次结构链中所有更高层次的对象上的setter,这相当慢。但我想我还是坚持住了。@Marco:听起来你有多种可变值类型。这几乎总是个坏主意。如果您可以使用类来代替,我建议您这样做。