2013-03-13 68 views
3

例如,我有以下課程。如何知道c#中的財產位置的層次結構?

public class Level1 
{ 
    public int intprop; 
    public Level2 level2; 
} 

public class Level2 
{ 
    public string strprop; 
    public Level3 level3; 
} 

public class Level3 
{ 
    public float fltprop; 
} 

現在,如果我得到fltprop,那麼如何知道這個屬性的層次結構是這樣的Level1.level2.level3.fltpro

有沒有反思方法來了解物業位置的層次?

更新:

如果你看進級1級到Level3的,你可以看到fltprop裏面是1級=>(第二級)=> 3級=> fltprop居住。

現在通過使用反射,如果我得到fltprop作爲PropertyInfo,那麼我可以知道這個屬性是從Level1 => level2 => level3?意味着採取propertyinfo然後我知道這個屬性的根級別3,然後知道level3的根級別2然後知道level2的根級別是level1。

+2

一般情況:沒有。你擁有的只是一個物體;該對象可以在許多不同的地方使用,或者可以從同一圖形中的多條路線訪問。如果你從表達式樹開始,例如'Expression > expr = x => x.Level2.Level3.fltprop;' - 如果你有* that * ,那麼答案變成「是」。 – 2013-03-13 09:27:17

回答

2

是否有任何反思方式來了解財產位置的層次?

不,沒有。

當您閱讀屬性(實際上它現在是一個字段),您只是有一個值。沒有關於您讀取的對象類型的信息。當您擁有對象本身(Level3對象)時,編譯器或運行時無法告訴您從哪裏獲取該對象。也許你剛剛創建了一個Level3的新實例,或者你可能從另一個對象的屬性中讀取它。你只知道這一點,而不是運行時。

編輯:

假設你傳遞PropertyInfofltprop,與Level3類型的對象的方法沿。該方法的所有信息是屬性名稱是fltprop,它是從Level3類型。這不告訴方法在哪裏Level3對象你傳遞給方法來自。這也不會存儲在Level3類型信息中。實際上,當您閱讀Level3的類型信息時,無論您獲得的類型如何,它都是相同的:

var type1 = level3Obj.GetType(); 
var type2 = level1Obj.level2.level3.GetType(); 
var type3 = typeof(Level3); 
var type4 = fltpropPropertyInfo.ReflectedType; 

Console.WriteLine(type1 == type2); // outputs 'true' 
Console.WriteLine(type2 == type3); // also outputs 'true' 
Console.WriteLine(type3 == type4); // also 'true' 
+0

如果你是對的,說例如通過使用反射我循環通過level1屬性並找到屬性fltprop。然後我通過propertyinfo.setvalue(...)設置值。那麼我們可以看到這個值在從level1讀取時反映出來。爲什麼我們不知道它從哪裏來? – 2013-03-13 09:36:21