C#,从父引用访问子属性?

Kev*_*oyd 4 c# inheritance

public void GetProps(Parent p){

   // want to access lots of child properties here
   string childProp1 = p.prop1;
   bool childProp2 = p.prop2;
   bool childProp3 = p.prop3;

}
Run Code Online (Sandbox Code Playgroud)

然而编译器抱怨说

“父级不包含定义 prop1”

该函数将采用 Class Parent 的不同子类型。

所有的子类都有这个

public override string prop1 { get; set; }
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

编辑: 使问题更清楚

我目前有一个巨大的 if-elseif,我在那里做类似的事情

if(p is Child0){
      Child0 ch = p as Child0; 

       // want to access lots of child properties here
       string childProp1 = ch.prop1;
       bool childProp2 = ch.prop2;
       bool childProp3 = ch.prop3;

}else if(p is Child1){
      Child1 ch = p as Child1; 

       // want to access lots of child properties here
       string childProp1 = ch.prop1;
       bool childProp2 = ch.prop2;
       bool childProp3 = ch.prop3;

}else if(...// and many more 
Run Code Online (Sandbox Code Playgroud)

现在我想删除所有冗余代码并创建一个可以处理所有这些的函数。

Jon*_*eet 6

如果所有子类都需要属性(但实现不同),则应在基类 ( )中将它们声明为抽象属性Parent,然后在子类中实现它们。

如果某些派生类没有这些属性,那么您希望当前GetProps的类做什么?

编辑:如果您使用的是 C# 4 并且您绝对无法获得更好的类设计(父类在其中声明属性),您可以使用动态类型:

public void GetProps(Parent p) {
    dynamic d = p;
    string childProp1 = d.prop1;
    bool childProp2 = d.prop2;
    bool childProp3 = d.prop3;
    // ...    
}
Run Code Online (Sandbox Code Playgroud)

不过,我会将其视为最后的手段......

  • @Kevin:那就是你的方法应该采用的类型,而不是 Parent (3认同)