在动态 ExpandoObject() 中存储指向 Vector3 的 C# 引用或指针?
Storing a c# reference or pointer to a Vector3 in a dynamic ExpandoObject()?
我有一个 class Player() 实例化 public Vector3 属性 AimTargetPos:
//Player.cs
private Vector3 aimTargetPos;
public Vector3 AimTargetPos => aimTargetPos;
在特定条件下,AimTargetPos 每帧更新一个新值。在另一个 class 中,AimTargetPos 按值存储在动态 ExpandoObject() 中作为 payload.aimTargetPos
,然后作为参数传递给调用的函数 Enter(dynamic payload)
.
由于 Player.AimTargetPos
仍在每帧更新,因此 payload.aimTargetPos
将仅在创建并传递到 Enter() 的同一帧中具有正确的 Vector3 值。我需要能够将 aimTargetPos 分配给本地 ref 或指针变量,这样我就可以在第一帧之后继续使用有效负载中的 aimTargetPos。但是,我还没有找到在动态 ExpandoObject 负载中存储对 Player.AimTargetPos
的引用的方法。
有一些我不想求助的 hacky 解决方案:
- 创建一个新的 Transform() 来保存位置 Vector3,因为默认情况下转换是通过引用传递的。
- 与其在有效负载 ExpandoObject 中传递引用或指针,不如连续读取
Player.AimTargetPos
每一帧以获得最新的位置值。这引入了我想避免的耦合程度。
根据 this question 的说法,没有一种单一的方法可以做到这一点,但听起来确实有多种选择。如果我不能在动态对象中保存引用,那么也许我可以存储 Player.AimTargetPos
的地址,并在 Enter() 中接收到有效负载后使用该地址创建引用或指针?但这似乎是一种不必要的深奥方法。有没有更简单的方法来实现这个?
首先我要问,为什么需要使用 ExpandoObject?
根据我使用类型化对象的经验,99.9% 的时间是一个非常好的解决方案(而且更简洁)。
话虽如此,您可以执行以下操作:
- 在您的 EO 中存储一个委托成员,returns 目标
expando.playerTarget = (Func<Vector3>) (() => { return player.aimTarget; });
- 将数据包装在 class 对象中并改为传递它
我个人的建议是尽可能避免使用动态。
我有一个 class Player() 实例化 public Vector3 属性 AimTargetPos:
//Player.cs
private Vector3 aimTargetPos;
public Vector3 AimTargetPos => aimTargetPos;
在特定条件下,AimTargetPos 每帧更新一个新值。在另一个 class 中,AimTargetPos 按值存储在动态 ExpandoObject() 中作为 payload.aimTargetPos
,然后作为参数传递给调用的函数 Enter(dynamic payload)
.
由于 Player.AimTargetPos
仍在每帧更新,因此 payload.aimTargetPos
将仅在创建并传递到 Enter() 的同一帧中具有正确的 Vector3 值。我需要能够将 aimTargetPos 分配给本地 ref 或指针变量,这样我就可以在第一帧之后继续使用有效负载中的 aimTargetPos。但是,我还没有找到在动态 ExpandoObject 负载中存储对 Player.AimTargetPos
的引用的方法。
有一些我不想求助的 hacky 解决方案:
- 创建一个新的 Transform() 来保存位置 Vector3,因为默认情况下转换是通过引用传递的。
- 与其在有效负载 ExpandoObject 中传递引用或指针,不如连续读取
Player.AimTargetPos
每一帧以获得最新的位置值。这引入了我想避免的耦合程度。
根据 this question 的说法,没有一种单一的方法可以做到这一点,但听起来确实有多种选择。如果我不能在动态对象中保存引用,那么也许我可以存储 Player.AimTargetPos
的地址,并在 Enter() 中接收到有效负载后使用该地址创建引用或指针?但这似乎是一种不必要的深奥方法。有没有更简单的方法来实现这个?
首先我要问,为什么需要使用 ExpandoObject?
根据我使用类型化对象的经验,99.9% 的时间是一个非常好的解决方案(而且更简洁)。
话虽如此,您可以执行以下操作:
- 在您的 EO 中存储一个委托成员,returns 目标
expando.playerTarget = (Func<Vector3>) (() => { return player.aimTarget; });
- 将数据包装在 class 对象中并改为传递它
我个人的建议是尽可能避免使用动态。