C# 如何将所有对象从一个IList移动/复制到另一个IList
我正在从事ASP.NETMVC4项目。我有C# 如何将所有对象从一个IList移动/复制到另一个IList,c#,.net,C#,.net,我正在从事ASP.NETMVC4项目。我有ViewModel,它是: public class SectionModel { public Menu Menu { get; set; } public IList<Document> Documents { get; set;} } 但是我不确定这样做是否正确。如果您的代码应该与其他项目交互操作,但在下面您总是使用列表,我建议使用接口 你必须改变这个 public class SectionModel {
ViewModel
,它是:
public class SectionModel
{
public Menu Menu { get; set; }
public IList<Document> Documents { get; set;}
}
但是我不确定这样做是否正确。如果您的代码应该与其他项目交互操作,但在下面您总是使用
列表,我建议使用接口
你必须改变这个
public class SectionModel
{
public Menu Menu { get; set; }
public List<Document> Documents { get; set;}
}
我一直都有一个共同的想法,就是在声明属性时使用接口来声明列表(或其他一些集合类型)。我理解这样做的动机,如果你决定把标准的.NET列表
类扔给你自己的孩子
我还没有找到合理的理由。你违反了“让我们在任何情况下都把一切抽象出来,即使它们不是特别相关”的成语。(我们不要忘记,POCO上的接口并不特别友好。)
如果我在设计一个API,我可能会使用IList
,即使一切都在内部使用列表。事实是,这有点用词不当。我从来没有理由使用IList,因为它就是这样。。。用词不当
正如Julie所说,交换掉该接口,并在其中放入一个合适的类(List
)。。它不仅是具体的,而且你可以使用它,因为它应该被使用。人们总是喜欢谈论接口的术语,以防我改变主意
,但这就是糟糕设计的臭味
不要害怕使用一个真实的、具体的类。 如果你考虑使用<代码> AutoPuffer-<代码>,这里的代码是:
首先,确保已安装AutoMapper
。使用packagemanager
并键入命令packageinstallautomapper
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);
var anonymous=new{
Menu=unitOfWork.MenuRepository.GetById(Id);,
Documents=unitOfWork.DocumentRepository.GetBy(x=>x.MenuID==menu.MenuID.ToList();
};
var sectionModel=AutoMapper.Mapper.DynamicMap(匿名);
我为什么建议用这个
第1点:IList
在这里很好。有人(或你)在设计时放在那里,一切都很好。根据我的说法,更改为列表
是不必要的。您的model
对象只是用来放置信息的,而IList
很好,因为您的sectionmodel
类不会更改或删除其中的任何条目。因为它只是用于枚举
很好
第2点:您可以进行手动映射。但是,AutoMapper
只是保持代码可读性。您应该尝试binding
或mapping
项目。检查Automapper
你也可以做一个演员阵容。@Leron:检查我的答案,寻找一个反论点。:)您的文档类型是否为ListIt'sIList
,如您所见。您是否建议将其更改为List
并仅使用AddRange
?您应该将其更改为List,以便使用AddRange@JulieShannon:不,这可能有味道。您不应该仅仅为了使用AddRange
,而将IList更改为List,尤其是当其较大时@Leron:Automapper
是一个很好的方法。看看。@Leron了解Moo Juice的答案是最好的方法。事实上,有了一些PHP和Java背景,让人觉得C#中的接口使用得更频繁。老实说,我不知道如何选择,我认为人们需要对语言有充分的了解,才能真正了解每种情况的利弊,但这并不能改变接口确实被大量使用的事实。@Moo juice:对不起,我不完全同意。为什么要更改模型
对象?毕竟,它的唯一目的是表示信息,而IList在这里看起来很适合我。仅为了使用AddRange
扩展方法,更改为List
看起来是不必要的。@现在他不必命名。一个公平的观点-但是如果我们沿着这条路线走,那么收集肯定会超越接口级别吗?你是说纯粹因为一个方法而使它成为List
而不是IList
,这就是推理。我们在谈论POCO,我希望我能得到一份清单。谢谢你的解释。我以前从未使用过AutoMapper
。不过看起来很有趣。尽管如此,我还是在寻求更自然的C#方法。使用第三方库似乎有点过分了。
public class SectionModel
{
public Menu Menu { get; set; }
public List<Document> Documents { get; set;}
}
model.Documents.AddRange(docs);
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);