C#反思:"指针"到一个值类型

时间:2016-01-27 07:01:52

标签: c# reflection unity3d

简短说明

我想知道是否有.NET功能让我操作通过反射获得的值类型。因此,当在值类型属性上调用PropertyInfo.getValue(...)时,我想要获取副本,而不是原始对象并对其进行操作。

我不允许使用不安全的指针。

详细说明

这个要求的出现是因为我正在实施一个让我操作Unity3d场景图的web服务。

场景图可能具有以下结构

  • GameObject 1
    • Vector 1.2
  • GameObject 2
    • Struct 2.1
    • Vector 2.2

客户端可以查询以下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部分。假设它在那里)

所以我必须能够查询包含值类型和引用类型的任意对象层次结构。对我正在做的事情有更好的方法吗?

1 个答案:

答案 0 :(得分:5)

  

因此,当在值类型属性上调用PropertyInfo.getValue(...)时,我想要获取副本,而不是原始对象并对其进行操作。

然后您需要访问该字段,而不是属性。或者,您需要调用getter来检索值的副本,修改副本,然后调用setter来更改包含对象的状态。

当你使用反思时,这不仅仅是真的 - 一般来说都是如此。你不能做类似的事情:

foo.Position.X = 10;

其中Position是一个类型为值类型的属性。您将收到编译时错误。相反,你需要这样的东西:

var position = foo.Position;
position.X = 10;
foo.Position = position;

你可以用反射做到这一点 - 当然假设 是一个设定者。

请注意,当您说"原始对象"这里,对于值类型(存储在该类型的字段中,即没有盒装), 没有对象。只有值,作为另一个对象的一部分的字段。