如何复制具有相同属性的不同类的对象?

时间:2012-11-06 07:01:43

标签: c# asp.net-mvc-3 object inheritance model

好日子的朋友们!

我有2个模型类,分别是 Page PageHistory 。都包含相同的属性。每当我编辑 Page 对象时,我都需要使用相同的属性值更新 PageHistory 对象。

我试过这样的事情:

[HttpPost]
        [ValidateInput(false)]
        public ActionResult Edit(Page page, FormCollection frm)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    page.IsPublished = !string.IsNullOrEmpty(frm["BtnPublish"]);
                    _db.Entry(page).State = EntityState.Modified;
                    _db.SaveChanges();

                    //Add updated page in hitory, if something is modified
                    PageHistory ph=new PageHistory();
                    ph.ID=page.ID
                    // likewise all attributes.....
                    // after all values are assigned, save a History object
                    ph.SaveChanges();

                    return RedirectToAction("Subpages", new { id = page.ParentId });
                }
            }
            catch (DataException)
            {
                //Log the error (add a variable name after DataException)
                ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists see your system administrator (http://support.mysite.com).");
            }
            return View(page);
        }

它正在工作,但这不是那么优化,有没有可用于复制对象的替代方案?还有一个问题是,是否可以从页面类中继承 PageHistory 类,因为它们都包含相同的属性?哪一个是最好的方法?

1 个答案:

答案 0 :(得分:2)

  1. 我建议您使用相同的模型进行相同的数据显示。

  2. 我建议你创建继承类PageHistory。它允许您将Page转换为PageHistory,如:

    (PageHistory) page;
    
  3. 我建议你将PageHistory道具复制封装在接口后面,如:

    public interface IPageHistoryBuilder
    {
        PageHistory Build(Page page);
    }
    
    public class PageHistoryBuilder : IPageHistoryBuilder
    {
        public PageHistory Build(Page page)
        {
            return new PageHistory
            {
                // copy ALL the props here
            }
        }
    }
    
  4. 您的代码如下:

    if (ModelState.IsValid)
    {
        page.IsPublished = !string.IsNullOrEmpty(frm["BtnPublish"]);
        _db.Entry(page).State = EntityState.Modified;
        _db.SaveChanges();
    
        var ph = pageHistoryBuilder.Build(page);
        ph.SaveChanges();
    // and so long
    }
    

    不要忘记在控制器构造函数中声明构建器:

    public class YourController : Controller
    {
         private readonly IPageHistoryBuilder pageHistoryBuilder;
         public YourController(IPageHistoryBuilder pageHistoryBuilder)
         {
             this.pageHistoryBuilder = pageHistoryBuilder;
         }
    }