2015-03-02 69 views
1

我有一類類似下面得到屬性值:如何從類對象在運行時使用反射

Class A : B<C> 
{ 
    public A(C entity):base(entity) 
    {} 
} 

abstract class B<T> 
{ 
    public B(T entity) 
     { 
      Entity = entity; 
     } 

     public T Entity { get; private set; } 
} 

Class C: D 
{ 
    public string prop2{get;set;} 
} 
Class D 
{ 
    public string prop1{get;set;} 
} 
Main() 
{ 
A obj = new A(new C()); 
obj.GetType().GetProperty("prop1", BindingsFlag.Instance|BindingsFlag.FlatteredHierarchy)// is null 


} 

我有A類的對象 我想從這個對象中獲取屬性值運行。

我與

obj.GetType().GetProprty("propertyName", 
         BindingsFlag.FlattenHierarchy).GetValue(obj, null); 

然而GetProprty()試圖爲物業無論是在d或C類中聲明的returing空。

有人可以請建議我如何實現這一目標嗎?

在此先感謝。

+0

您能否給我們提供一個可重複的例子,並正確拼寫方法名? – JLRishe 2015-03-02 10:22:11

+0

順便說一句,這應該已經被問了很多次.......... – 2015-03-02 10:23:08

回答

2
GetType().GetProperty("propertyName", BindingsFlag.FlattenHierarchy) 
     .GetValue(obj, null); 

您misssing指定wheter獲得實例或靜態屬性綁定標誌:

BindingsFlag.FlattenHierarchy | BindingsFlag.Instance 

根據MSDN標誌BindingsFlag.InstanceBindingsFlag.Static以獲得不空值必須specifed顯式

您必須指定BindingFlags.Instance或BindingFlags.Static 才能獲得回報。

更重要的是,public屬性是默認排除的。所以,如果你屬性是public你需要指定其他標誌:

BindingsFlag.FlattenHierarchy | BindingsFlag.Instance | BindingsFlag.Public 

備註:

指定BindingFlags.Public包括在 搜索公共屬性。

如果在基礎屬性是私有的,FlattenHierarchy不會枚舉它:

(...)在繼承類私有靜態成員不包括 如果您遇到這種情況,恐怕您必須手動通過基類並搜索該屬性。

請確保該屬性名稱有效並存在。

編輯: 編輯後,我看到了問題。 你的A類不是D類的子類(你想從D類獲得屬性)。這就是爲什麼獲得財產價值不以這種方式工作。 您需要按照以下步驟:

// get entity prop value 
var entityValue = 
    (obj.GetType() 
     .GetProperty("Entity", 
      BindingFlags.FlattenHierarchy | BindingFlags.Instance | BindingFlags.Public) 
     .GetValue(obj)); 
// get prop value 
var prop1Value = 
    entityValue.GetType() 
       .GetProperty("prop1", 
        BindingFlags.FlattenHierarchy | 
        BindingFlags.Instance | 
        BindingFlags.Public) 
       .GetValue(entityValue); 

記住處理值等。

+0

感謝您的評論,但我已經嘗試了BindingFlag.Instance但它沒有工作 – vishal 2015-03-02 10:24:57

+0

請參閱我的關於'BindingFlags.Public'的編輯。 – 2015-03-02 10:26:43

+0

謝謝,但沒有工作,請參閱我添加了一個示例,以更多地瞭解問題 – vishal 2015-03-02 10:35:04