C# C"反思:";指针;转换为值类型

C# C"反思:";指针;转换为值类型,c#,reflection,unity3d,C#,Reflection,Unity3d,简短描述 我想知道是否有一个.NET特性允许我操作通过反射获得的值类型。因此,在对值类型属性调用PropertyInfo.getValue(…)时,我不希望获取副本,而是希望获取原始对象并对其进行操作 我不允许使用不安全的指针 详细描述 这个需求的产生是因为我正在实现一个Web服务,让我可以操作Unity3d场景图 场景图可能具有以下结构 游戏对象1 向量1.2 游戏对象2 结构2.1 向量2.2 客户端可以查询以下URI: 得到 这是可行的,因为它非常简单,只需通过反射遍历层次结构

简短描述

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

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

详细描述

这个需求的产生是因为我正在实现一个Web服务,让我可以操作Unity3d场景图

场景图可能具有以下结构

  • 游戏对象1
    • 向量1.2
  • 游戏对象2
    • 结构2.1
    • 向量2.2
客户端可以查询以下URI:

得到

这是可行的,因为它非常简单,只需通过反射遍历层次结构,按名称(例如Struct或Vector)搜索属性,并在相应的PropertyInfo上调用getValue,然后将其返回给客户端

但客户也可以查询:

以例如5.4作为主体发布。然后,向量的x属性应设置为5.4

我现在正在做的是向前遍历图形(如GET),直到找到向量对象。然后我做一个递归的setValue,直到我在一个引用类型上做setValue

object2.setValue(Vector.setValue(5.4))

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

因此,我必须能够查询包含值类型和引用类型的任意对象层次结构。有没有更好的方法来完成我的工作

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

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

当你使用反射时,这不仅是正确的,一般来说也是正确的。你不能这样做:

foo.Position.X = 10;
var position = foo.Position;
position.X = 10;
foo.Position = position;
其中,
Position
是类型为值类型的属性。您将得到一个编译时错误。相反,您需要的是:

foo.Position.X = 10;
var position = foo.Position;
position.X = 10;
foo.Position = position;
您可以通过反射来实现这一点——当然,假设有一个setter

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

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

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

当你使用反射时,这不仅是正确的,一般来说也是正确的。你不能这样做:

foo.Position.X = 10;
var position = foo.Position;
position.X = 10;
foo.Position = position;
其中,
Position
是类型为值类型的属性。您将得到一个编译时错误。相反,您需要的是:

foo.Position.X = 10;
var position = foo.Position;
position.X = 10;
foo.Position = position;
您可以通过反射来实现这一点——当然,假设有一个setter


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

谢谢。目前我正在做你描述的事情。调用getter,操纵值,然后调用setter。只是因为我处于对象/属性的层次结构中,所以我需要递归地调用层次结构链中所有更高层次的对象上的setter,这相当慢。但我想我还是坚持住了。@Marco:听起来你有多种可变值类型。这几乎总是个坏主意。如果您可以使用类来代替,我建议您这样做。谢谢。目前我正在做你描述的事情。调用getter,操纵值,然后调用setter。只是因为我处于对象/属性的层次结构中,所以我需要递归地调用层次结构链中所有更高层次的对象上的setter,这相当慢。但我想我还是坚持住了。@Marco:听起来你有多种可变值类型。这几乎总是个坏主意。如果您可以使用类来代替,我建议您这样做。