C# 将基类属性值指定给派生类

C# 将基类属性值指定给派生类,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,我有一个基础模型和一个从中派生的视图模型 基本型号 public class Feed { public int Id { get; set; } public string Name { get; set; } public string Url { get; set; } } public class FeedViewModel : Feed { public bool EditMode { get; set; } } 衍生模型 public class Feed { p

我有一个基础模型和一个从中派生的视图模型

基本型号

public class Feed
{
public int Id { get; set; }
public string Name { get; set; }
public string Url { get; set; }
}
public class FeedViewModel :  Feed
{
   public bool EditMode { get; set; }    
}
衍生模型

public class Feed
{
public int Id { get; set; }
public string Name { get; set; }
public string Url { get; set; }
}
public class FeedViewModel :  Feed
{
   public bool EditMode { get; set; }    
}
数据访问层

public Feed GetFeed(){
   --db code to retreive all feed
}
public FeedController : Controller
{
   public ActionResult Index()
   {
        var data = DAL.GetFeed();
        var model = new FeedViewModel{ EditMode = true };

         model.Id = data.Id;
         model.Name = data.Name;
         model.Url = data.Url;   //This is working

       //But i dont want like this, coz i cant reassign all the proerties again. Is there any other easy way like this
        model = (FeedViewModel)data;
    } 
 }
控制器

public Feed GetFeed(){
   --db code to retreive all feed
}
public FeedController : Controller
{
   public ActionResult Index()
   {
        var data = DAL.GetFeed();
        var model = new FeedViewModel{ EditMode = true };

         model.Id = data.Id;
         model.Name = data.Name;
         model.Url = data.Url;   //This is working

       //But i dont want like this, coz i cant reassign all the proerties again. Is there any other easy way like this
        model = (FeedViewModel)data;
    } 
 }

我不想将所有属性值重新分配给派生模型。相反,我在寻找其他简单的方法?有什么想法吗?

我建议使用合成而不是继承:

public class FeedViewModel
{
    public bool EditMode { get; set; }    
    public Feed Feed { get; set; }
}
然后:

从根本上说,我不希望视图模型与它作为视图模型的模型相同——我希望能够使用该模型,但我不希望对其使用继承

视图模型可以通过委托公开视图的属性,如果您愿意的话-可能带有属性更改通知

编辑:另一种选择(可能也不适用-我们不知道您在该项目中可以做多少更改)是使您的
GetFeed
方法在DAL中通用:

public Feed GetFeed<T>() where T : Feed, new()
{
   --db code to retreive all feed
}
public提要GetFeed(),其中T:Feed,new()
{
--检索所有提要的db代码
}
然后,您可以使用以下命令调用它:

var model = DAL.GetFeed<FeedViewModel>();
model.EditMode = true;
var model=DAL.GetFeed();
model.EditMode=true;
使用

创建一个
AutoMapperConfig
类,如下所示:

public class AutoMapperConfig
{
    public static void CreateMaps()
    {
        // Feed domain / view model mappings
        Mapper.CreateMap<FeedViewModel, Feed>()
        Mapper.CreateMap<Feed, FeedViewModel>();            
    }
}
然后在其他一些行动中,你只需颠倒这个过程

[HttpPost]
public ActionResult SomeOtherAction()
{
    FeedViewModel model = new FeedViewModel();
    TryUpdateModel(model);

    if (ModelState.IsValid)
    {
        var feed = Mapper.Map<FeedViewModel, Feed>(model);
        DAL.UpdateFeed(feed);
    }

    return View(model)
}
[HttpPost]
公共行动结果其他行动()
{
FeedViewModel模型=新的FeedViewModel();
TryUpdateModel(model);
if(ModelState.IsValid)
{
var feed=Mapper.Map(模型);
DAL.更新进料(进料);
}
返回视图(模型)
}

@谢谢,谢谢你的建议。但很抱歉,我想在视图模型中使用更多属性扩展基础模型,因此我无法使用合成。还有其他想法吗?@SSS:那只是说“我不能使用合成,因为我想使用继承”——它没有给出任何你想使用继承的理由。我再次强烈建议不要在这里继承遗产。我不希望代码将视图模型视为原始模型,那么为什么要使用继承呢?@是的,我理解,但我目前在维护项目中,实现的
FeedViewModel
是来自
Feed
的派生对象,如果我改为composition,则会涉及大量重构工作。所以我需要我所要求的。希望你understand@SSS:如果你不能用好的方式做事情,你就必须用你已经见过的丑陋的方式来做——将属性从一个对象复制到另一个对象。这种丑陋往往发生在设计糟糕的对象模型中。@SSS:最终的答案是,没有任何东西可以满足您更改现有对象类型的明显愿望。您需要更改
GetFeed
,以便它可以返回
FeedViewModel
,或者您需要将属性从一个对象复制到另一个对象。这可能在
FeedViewModel
构造函数中,它可能使用AutoMapper。。。各种选择。但是你根本无法改变现有对象的类型。太好了!我很高兴这有帮助。