在C#中将基类转换为子类

时间:2012-06-19 13:49:01

标签: c# asp.net-mvc-3

我是OOP和C#的新手,我正在努力理解,如何尽可能地将我的代码编写为DRY。在我的ASP.NET MVC 3应用程序中,我在控制器中有多个操作(在此示例代码中有两个),它们都返回不同的ViewModel,它们都继承了相同的BaseViewModel。这是因为我需要在每个操作上使用相同的数据,但每个操作都有其他属性。

我知道我可以简单地为ActionOneViewModel创建一个接收ViewModel对象的构造函数。但这是通常的方法吗?或者有其他选择吗?

查看模型:

class BaseViewModel 
{
    public string Name { get; set; }
    public List<User> Users { get; set; }
}

class ActionOneViewModel : BaseViewModel 
{
    public bool FooBar { get; set; }
}

class ActionTwoViewModel : BaseViewModel 
{
    public string PingPong { get; set; }
}

控制器操作:

public ActionResult ActionOne () 
{
    // this doesn't work (of course)
    ActionOneViewModel model = (ActionOneViewModel)createViewModel();
    model.FooBar = true;

    return View(model);
}

public ActionResult ActionTwo () 
{
    // this doesn't work (of course)
    ActionTwoViewModel model = (ActionTwoViewModel)createViewModel();
    model.PingPong = "blub";

    return View(model);
}

private BaseViewModel createViewModel()
{
    BaseViewModel model = new BaseViewModel();

    //
    // doing a lot of stuff here
    //

    return model;
}

4 个答案:

答案 0 :(得分:3)

怎么样:

ActionTwoViewModel model = new ActionTwoViewModel();
model = createViewModel(model);


private BaseViewModel createViewModel(BaseViewModel model)
{
    //
    // doing a lot of stuff here
    //

    return model;
}

答案 1 :(得分:3)

您可以在方法或构造函数

中执行此操作

使用那个,不需要特殊的“createViewModel”方法。

class BaseViewModel 
{
    public BaseViewModel() {
     //stuff here
     }
    public string Name { get; set; }
    public List<User> Users { get; set; }
}

class ActionOneViewModel : BaseViewModel 
{
    public ActionOneViewModel (bool fooBar) : base() {
         FooBar = fooBar;
    }
    public bool FooBar { get; set; }
}

class ActionTwoViewModel : BaseViewModel 
{
    public ActionTwoViewModel(string pingPong) :base() {
      PingPong = pingPong;
    }
    public string PingPong { get; set; }
}

使用

public ActionResult ActionTwo () 
{
    // this doesn't work (of course)
    var model = new ActionTwoViewModel("blub");

    return View(model);
}

答案 2 :(得分:1)

使用base(在MSDN上),您可以调用超类构造函数,然后为您的类添加您的东西。

public class ActionOneViewModel : BaseViewModel 
{
    public ActionOneViewModel (bool fooBar) : base()
    {
        //other stuff here
        model.FooBar = fooBar;
    }
}

答案 3 :(得分:1)

有点通用,这将有效:

private T CreateViewModel<T>()
    where T : BaseViewModel, new()
{
    BaseViewModel model = new T();
    //doing a lot of stuff here
    return (T)model;
}

您可以像以下一样使用它:

ActionOneViewModel  model1 = CreateViewModel<ActionOneViewModel>();
ActionTwoViewModel  model2 = CreateViewModel<ActionTwoViewModel>();