如何将所有对象从一个IList移动​​/复制到另一个IList

时间:2013-12-08 17:36:18

标签: c# .net

我正在研究ASP.NET MVC 4项目。我有ViewModel

public class SectionModel
{
    public Menu Menu { get; set; }
    public IList<Document>  Documents { get; set;}
}

然后在我的行动中我有:

Menu menu = unitOfWork.MenuRepository.GetById(Id);
IList<Document> docs = unitOfWork.DocumentRepository.GetBy(x => x.MenuID ==  menu.MenuID).ToList();
                SectionModel model = new SectionModel();
                model.Menu = menu;//???
                model.Documents = docs;//??? 

因此从数据库中获取menudocs。当我创建SectionModel的新实例时,我想传递值,但我不确定什么是正确的方法。实际上,分配单个对象menuIList<Document> docs

的方式是什么

我在考虑model.Menu.Add(menu),然后是一些类似的预言:

foreach (var doc in docs)
{
  model.Documents.Add(doc);
}

但我不确定这是否正确。

3 个答案:

答案 0 :(得分:3)

我总是看到一个共同思路,即在声明属性时使用接口来声明列表(或其他一些集合类型)。我理解这样做的动机,如果你决定抛出标准的.NET List<>课程,而不是你的本土课程。

我还没有看到一个合理的理由。你对“让所有情况下的所有内容都抽象出来,即使它们并不是特别相关”也是如此。 (我们不要忘记,POCO上的接口并不特别对ORM友好。)

如果我正在设计API,我可能会使用IList,即使内部的List一切正常。事实是,这有点用词不当。我从来没有理由使用IList<>,因为这就是......程序化的误称。

正如朱莉所说,换掉那个界面并在那里放一个体面的类(例如List<>)..不仅具体,而且你可以使用它,因为它应该被使用。人们喜欢关注interfaces always in case I change my mind的条款,但这只是糟糕的设计。

不要害怕使用真正的具体课程。

答案 1 :(得分:1)

如果您的代码应与其他项目互操作,但我在下面使用List<T>

,我推荐使用接口

你必须改变这个

 public class SectionModel
{
    public Menu Menu { get; set; }
    public List<Document>  Documents { get; set;}
}

并使用

  model.Documents.AddRange(docs);

答案 2 :(得分:1)

如果您考虑使用AutoMapper,请输入以下代码:

首先,确保安装了AutoMapper。使用package-manager并输入命令package-install AutoMapper

var anonymous = new { 
  Menu = unitOfWork.MenuRepository.GetById(Id);, 
  Documents = unitOfWork.DocumentRepository.GetBy(x => x.MenuID ==  menu.MenuID).ToList(); 
};


  var sectionModel = AutoMapper.Mapper.DynamicMap<SectionModel>(anonymous);

为什么我建议使用它?

第1点:IList在这里很好。有人(或你)在设计过程中放在那里,这很好。据我所知,改为List是不必要的。您的model对象就在那里放置信息,IList很好,因为您的sectionmodel类不会更改或删除任何条目。因为它只是enumeration的罚款。

第2点:您可以进行手动映射。但是,AutoMapper只是维护代码可读。