2012-11-07 164 views
2

我試圖做一些動態的文本對象分析,但是,我創建和設置嵌套屬性值的結構時遇到了一個障礙。c#嵌套結構屬性的反射

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

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不會改變。當然,我將其歸因於結構是值類型而不是引用類型的事實。

所以真正的問題是我如何使用反射來獲取值類型的引用。

+0

有沒有可能避免讓可變結構開始? –

+0

這真的是我正在創建的庫,它允許將分隔文件解析爲動態對象。到目前爲止,它可以找到純引用類型的對象。然而,當進入價值型容器時,我似乎遇到了這個問題。 – galford13x

+0

所以不要使用「值類型容器」。基本上,可變的結構只是壞消息。 –

回答

5

如果我在一個結構對象中有一個屬性,每當我使用反射來獲取結構對象並設置它的任何屬性/字段時,對象的值都不會改變。

哦,不 - 因爲在這條線:

object nestedStruct = pInfo.GetValue(myObj); 

...你複製的價值,因爲它是一個值類型。你也在裝箱 - 這很好,因爲這意味着當你在intInfo.SetValue調用中改變它時,它就是被修改的盒裝副本。 (如果你在打電話intInfo.SetValue點拳來,那真的是沒有希望的。)

您所做的盒裝版中的變更後,你再需要設置回的財產對象:

pInfo.SetValue(myObject, nestedStruct); 

這將是有益的嘗試做你正在使用反射做什麼

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

編譯器會給你一個在最後的第n行的錯誤,並解釋說這是應該做的傻事:

test.cs中(20,9):錯誤CS1612:無法修改的「MyObj.NestedStruct」的返回值,因爲它不是一個變量

+0

在我所有使用過的結構中,我從來沒有遇到過這種情況。我真的不知道我明白爲什麼。你能否指出一些可能解釋爲什麼它不是變量的文檔? – galford13x

+0

考慮之後,爲什麼它不是一個變量,它是一組屬性而不是字段,這是完全有道理的。 – galford13x

+0

@ galford13x:很高興我不需要嘗試進入它:)(我只是剛剛看到你以前的評論,我害怕。) –