重构我的代码:避免在派生类中进行强制转换

nXq*_*Xqd 3 c# refactoring

首先,我对标题感到抱歉,我不知道如何准确描述我的问题.我希望通过代码更好地解释.

public abstract class AB {
  public MyModel Model;
}

public class A : AB {
  public A() {
    Model = new MyModelA();
  }

  public void AMethod() {
    var model = (MyModelA) model; // I have to do this all place
  }

  public void AnotherMethod() {
    var model = (MyModelA) model; // same here
    model.NewInt = 123;
  }
}

public abstract class MyModel {

}

public class MyModelA : MyModel {
  // new properties
  public int NewInt {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

看看代码,为了使用派生类的新属性,我必须做一个演员,但是当我必须在同一时间使用它时它很难看.

我认为这个方法声明了另一个属性:public MyModelA _tmp然后我将它转换为构造函数_tmp = (MyModelA) Model并使用它代替Model.

有没有其他适当的方法来做到这一点?谢谢 !

SLa*_*aks 10

您可以使基类通用:

public abstract class ServiceBase<TModel> where TModel : new() {
    protected ServiceBase() { Model = new TModel(); }
    public TModel Model { get; private set; }
}

public class AService : ServiceBase<MyModelA> {
    ...
}
Run Code Online (Sandbox Code Playgroud)