2011-12-13 86 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映射器。有那么多,有些必须满足你的需求!