AutoMapper继承和Linq

edi*_*ode 19 .net c# linq automapper

我一直在研究如何使用继承,AutoMapper但我正努力让它完全运行Linq.这是我的代码:

我在这里定义了我的映射:

CreateMap<Article, ArticleDetailsViewModel>()
    .Include<Article, ArticleNewsItemDetailsViewModel();

CreateMap<Article, ArticleNewsItemDetailsViewModel>();
Run Code Online (Sandbox Code Playgroud)

ArticleDetailsViewModel是一个基类ArticleNewsItemDetailsViewModel.

现在问题在于,如果我有:

CreateMap<ArticleNewsItem, ArticleNewsItemDetailsViewModel>();
Run Code Online (Sandbox Code Playgroud)

视图模型中的所有属性都将自动映射,因为它们与Linq对象相同.但是,因为我使用Article => ArticleNewsItemDetailsViewModel映射这是不可能的,相反,我必须将每个定义为:

.ForMember(x => x.Property1, opt => opt.MapFrom(src => src.ArticleNewsItem.Property1)
Run Code Online (Sandbox Code Playgroud)

我想过将所有属性从ArticleNewsItemDetailsViewModel一个新的视图模型中移出并让该类成为一个属性ArticleNewsItemDetailsViewModel,只要这两个对象之间存在映射,它就可以工作,但感觉不是很干净.

有什么方法可以避免这样做吗?

Nin*_*Nye 0

如果我在头脑中过度简化了这一点,我深表歉意,但您不能简单地添加您提到的直接映射吗:

CreateMap<ArticleNewsItem, ArticleNewsItemDetailsViewModel>();
Run Code Online (Sandbox Code Playgroud)

对我来说,这是最简单、最干净的解决方案......

编辑 抱歉,我误解了。如果不通过 .ConstructUsing() 或 .ConvertUsing() 方法(或以不整洁的方式进行)创建自定义映射,则无法将对象映射到嵌套属性...

Mapper.CreateMap<Article, ArticleNewsItemDetailsViewModel>().ConstructUsing(ConstructItem)
Run Code Online (Sandbox Code Playgroud)

..然后创建方法来构建 ArticleNewsItemDetailsViewModel...

private static ArticleNewsItemDetailsViewModel ConstructItem(Article source)
    {
        var newsItem = new ArticleNewsItem
                           {
                               Prop1 = source.Prop1,
                               Prop2 = source.Prop2
                           };

        var result = new ArticleNewsItemDetailsViewModel()
                         {
                             ArticleNewsItem = newsItem
                         };

        return result;
    }
Run Code Online (Sandbox Code Playgroud)

不过,我仍然建议重新实施您的解决方案,以便您映射“同类”。这是一个很好的例子:http://automapper.codeplex.com/wikipage? title=Nested%20Mappings