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));

(为简单起见,我省略了属性信息部分。 假设它在那里)

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

C# 反射:“指针”到值类型

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

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

当你使用反射时,这不仅是正确的 - 一般来说也是如此。您不能执行以下操作:

foo.Position.X = 10;

其中Position是类型为值类型的属性。你将收到编译时错误。相反,您需要以下内容:

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

你可以通过反思来做到这一点——当然,假设有一个二传手。

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