简短说明
我想知道是否有.NET功能让我操作通过反射获得的值类型。因此,当在值类型属性上调用PropertyInfo.getValue(...)时,我想要获取副本,而不是原始对象并对其进行操作。
我不允许使用不安全的指针。
详细说明
这个要求的出现是因为我正在实施一个让我操作Unity3d场景图的web服务。
场景图可能具有以下结构
客户端可以查询以下URI:
获取http://.../GameObject2/StructProperty/someProperty
这很简单,就像通过反射遍历层次结构一样简单,按名称搜索属性(例如Struct或Vector)并在相应的PropertyInfo上调用getValue,将其返回给客户端。
但客户也可以查询:
POST http://.../GameObject2/VectorProperty/xProperty例如5.4作为实体。然后应将Vector的x属性设置为5.4
我现在正在做的是向前遍历图形(就像使用GET一样)直到找到Vector对象。然后我做一个递归的setValue UNTIL我在引用类型上做setValue,例如。
object2.setValue(Vector.setValue(5.4));
(为简单起见,我省略了PropertyInfo部分。假设它在那里)
所以我必须能够查询包含值类型和引用类型的任意对象层次结构。对我正在做的事情有更好的方法吗?
答案 0 :(得分:5)
因此,当在值类型属性上调用PropertyInfo.getValue(...)时,我想要获取副本,而不是原始对象并对其进行操作。
然后您需要访问该字段,而不是属性。或者,您需要调用getter来检索值的副本,修改副本,然后调用setter来更改包含对象的状态。
当你使用反思时,这不仅仅是真的 - 一般来说都是如此。你不能做类似的事情:
foo.Position.X = 10;
其中Position
是一个类型为值类型的属性。您将收到编译时错误。相反,你需要这样的东西:
var position = foo.Position;
position.X = 10;
foo.Position = position;
你可以用反射做到这一点 - 当然假设 是一个设定者。
请注意,当您说"原始对象"这里,对于值类型(存储在该类型的字段中,即没有盒装), 没有对象。只有值,作为另一个对象的一部分的字段。