[英]C# Reflection: “Pointer” to a value-type
簡短的介紹
我想知道是否有.NET功能,讓我可以操縱通過反射獲得的值類型。 因此,當在值類型屬性上調用PropertyInfo.getValue(...)時,我不想獲取副本,而是要獲取原始對象並對其進行操作。
我不允許使用不安全的指針。
詳細描述
之所以出現此要求,是因為我正在實現一個Web服務,讓我可以操縱Unity3d場景圖。
場景圖可能具有以下結構
客戶端可以查詢以下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.