C# 反射:“指针”到值类型
本文关键字:类型 指针 反射 | 更新日期: 2023-09-27 18:32:13
简短描述
我想知道是否有 .NET 功能允许作通过反射获得的值类型。因此,当在值类型属性上调用 PropertyInfo.getValue(...) 时,我不想获取副本,而是获取原始对象并对其进行操作。
我不允许使用不安全的指针。
详细描述
之所以出现此要求,是因为我正在实现一个允许作 Unity3d 场景图的 Web 服务。
场景图可能具有以下结构
- 游戏对象 1
- 矢量 1.2
- 游戏对象 2
- 结构 2.1
- 矢量 2.2
客户端可以查询以下 URI:
获取 http://.../GameObject2/StructProperty/someProperty
这是有效的,因为它就像通过反射遍历层次结构一样简单,按名称(例如结构或向量)搜索属性,并在相应的 PropertyInformation 上调用 getValue,并将其返回给客户端。
但客户端也可以查询:
POST http://.../GameObject2/VectorProperty/xProperty,例如 5.4 作为实体主体。然后,矢量的 x 属性应设置为 5.4
我现在正在做的是向前遍历图形(就像使用 GET 一样),直到找到 Vector 对象。然后我正在做一个递归的 setValue 直到我在引用类型上做 setValue,例如
object2.setValue(Vector.setValue(5.4));
(为简单起见,我省略了属性信息部分。 假设它在那里)
因此,我必须能够查询包含值类型和引用类型的任意对象层次结构。对于我正在做的事情,有没有更好的方法?
因此,当在值类型属性上调用 PropertyInfo.getValue(...) 时,我不想获取副本,而是获取原始对象并对其进行操作。
然后,您需要访问字段,而不是属性。或者,您需要调用 getter 来检索值的副本,修改副本,然后调用 setter 来更改包含对象的状态。
当你使用反射时,这不仅是正确的 - 一般来说也是如此。您不能执行以下操作:
foo.Position.X = 10;
其中Position
是类型为值类型的属性。你将收到编译时错误。相反,您需要以下内容:
var position = foo.Position;
position.X = 10;
foo.Position = position;
你可以通过反思来做到这一点——当然,假设有一个二传手。
请注意,当您在这里说"原始对象"时,对于值类型(存储在该类型的字段中,即未装箱)没有对象。只有值,作为另一个对象的一部分的字段。