簡體   English   中英

C#嵌套結構體屬性的反射

[英]c# Reflection of a nested struct property

我正在嘗試對對象進行一些動態文本分析,但是,在創建和設置結構的嵌套屬性值時遇到了麻煩。

如果我在作為結構的對象中有一個屬性,則每當我使用反射獲取該結構對象並設置其任何屬性/字段時,該對象上的值都不會更改。 拿下面的對象圖。

public struct MyStruct
{
    public int MyIntProp {get;set;}
}

public class MyObj
{
    public MyStruct NestedStruct {get;set;}
}

PropertyInfo pInfo = (myObj.GetType()).GetProperty("NestedStruct");
object nestedStruct = pInfo.GetValue(myObj); // This is the nested struct however it is only a copy not the actual object
PropertyInfo intInfo = (pInfo.PropertyType).GetProperty("MyIntProp");
intInfo.SetValue(nestedStruct, 23); // this sets the MyIntProp on the nestedStruct, but it is not set on the myObj.NestedStruct.  My goal is to set object on that NestedStruct via reflection.

當我使用反射獲取NestedStruct屬性,然后在該結構上設置MyIntProp時,原始MyObj.NestedStruct.MyIntProp不會更改。 自然,我將其歸因於struct是值類型而不是引用類型的事實。

因此,真正的問題是我如何使用反射來獲取對值類型的引用。

如果我在作為結構的對象中有一個屬性,則每當我使用反射獲取該結構對象並設置其任何屬性/字段時,該對象上的值都不會更改。

好吧,不-因為在這一行:

object nestedStruct = pInfo.GetValue(myObj);

...您正在復制值,因為它是值類型。 您還可以將其裝箱-很好,因為這意味着當您在intInfo.SetValue調用中對其進行突變時,它是被裝箱的副本。 (如果要在調用intInfo.SetValue時將其intInfo.SetValue ,那將是毫無希望的。)

在盒裝副本中進行更改后,需要將其重新設置為對象的屬性:

pInfo.SetValue(myObject, nestedStruct);

嘗試使用反射來做您正在做的事情將是有益的:

MyObj myObj = new MyObj();
myObj.NestedStruct.MyIntProp = 23;

編譯器將在最后一行給您一個錯誤,解釋這是一件很愚蠢的事情:

Test.cs(20,9):錯誤CS1612:無法修改'MyObj.NestedStruct'的返回值,因為它不是變量

暫無
暫無

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

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