2011-12-13 88 views
0
class A 
{ 
    public string PropA {set; get;} 

    public A() 
    { 
     var props = this.GetType().GetProperties(BindingFlags.Public); 
    } 
} 


class B : A 
{ 
    public string PropB {set; get;} 
} 

var b = new B(); 

A調用構造函數,變量props只包含PropA。有可能獲得所有房產(PropAPropB)?在父類的構造獲取子類的屬性

+2

是否有任何特定的原因必須在構造函數中? 'A'構造函數中的''this'將始終爲'A'類型。 – BoltClock

+0

@BoltClock,我需要創建ORM。 B類是一個模型(例如評論)。 A類是常見的ORM模型,它定義了Save,Add,Get和e.t等操作。 B中的每個字段是數據庫表中的字段。我需要知道,什麼字段包含表來構建SQL查詢。也許有更好的方法來做到這一點? – Deadly

回答

2

這一次爲我的作品:

var props = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); 
+0

Thx,效果很好! – Deadly

0

父類(如您已定義的構造函數)不知道它的子類,這就是爲什麼它返回只是PropA 如果定義在B類constractor它將返回兩個性的判定什麼

0

的基類A的構造函數運行之前派生類B的構造函數,因此您無法訪問派生類的屬性。

順便說一句:這對我來說沒有任何意義,基類有派生類的知識!

0

你可以這樣做:

class A 
{ 
    public string PropA {set; get;} 

    public A() 
    { 
    } 

    protected virtual PropertyInfo[] GetProperties() 
    { 
     return this.GetType().GetProperties(BindingFlags.Public); 
    } 
} 


class B : A 
{ 
    public string PropB {set; get;} 

    public B() : base() 
    { 
    } 

    public new PropertyInfo[] GetProperties() 
    { 
     return this.GetType().GetProperties(BindingFlags.Public); 
    } 
} 

var b = new B(); 
var prop = b.GetPropeties(); 
0

的基類不應該知道它的派生類的任何信息。它打破了開放封閉原則和Liskov替代原則。

您使用泛型和虛擬或抽象方法解決此問題。另外,不要編寫自己的O/R映射器。有那麼多,有些必須滿足你的需求!