簡體   English   中英

C#反思:“指針”到值類型

[英]C# Reflection: “Pointer” to a value-type

簡短的介紹

我想知道是否有.NET功能,讓我可以操縱通過反射獲得的值類型。 因此,當在值類型屬性上調用PropertyInfo.getValue(...)時,我不想獲取副本,而是要獲取原始對象並對其進行操作。

我不允許使用不安全的指針。

詳細描述

之所以出現此要求,是因為我正在實現一個Web服務,讓我可以操縱Unity3d場景圖。

場景圖可能具有以下結構

  • 游戲對象1
    • 矢量1.2
  • 游戲對象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直到我對引用類型例如setValue

object2.setValue(Vector.setValue(5.4));

(為簡單起見,我省略了PropertyInfo部分。假設它在那里)

因此,我必須能夠查詢包含值類型和引用類型的任意對象層次結構。 有什么更好的方式來做我的事情嗎?

因此,當在值類型屬性上調用PropertyInfo.getValue(...)時,我不想獲取副本,而是要獲取原始對象並對其進行操作。

然后,您需要訪問字段,而不是屬性。 或者,您需要調用getter來獲取值的副本,修改副本,然后調用setter來更改包含對象的狀態。

當您使用反射時,不僅如此,而且通常如此。 您不能執行以下操作:

foo.Position.X = 10;

其中Position是屬性,其類型是值類型。 您會收到一個編譯時錯誤。 相反,您將需要以下內容:

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

你可以做到這一點與反思-假設一個二傳手,當然。

請注意,當你說“原始對象”在這里,一個值類型(存儲在該類型的字段,即不盒裝)有沒有對象。 作為字段的另一個對象的一部分,只有值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM