C#反射:指向值类型的"指针"

Mar*_*rco 0 c# reflection unity-game-engine

简短的介绍

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

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

详细描述

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

场景图可能具有以下结构

  • GameObject 1
    • 矢量1.2
  • GameObject 2
    • 结构2.1
    • 矢量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部分.假设它在那里)

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

Jon*_*eet 5

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

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

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

foo.Position.X = 10;
Run Code Online (Sandbox Code Playgroud)

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

var position = foo.Position;
position.X = 10;
foo.Position = position;
Run Code Online (Sandbox Code Playgroud)

你可以做到这一点与反思-假设有一个二传手,当然.

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