gpt4 book ai didi

c# - AutoMapper继承和Linq

转载 作者:IT王子 更新时间:2023-10-29 04:45:07 26 4
gpt4 key购买 nike

我一直在研究如何在 AutoMapper 中使用继承,但我正在努力让它与 Linq 完全兼容。这是我的代码:

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

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

CreateMap<Article, ArticleNewsItemDetailsViewModel>();

ArticleDetailsViewModelArticleNewsItemDetailsViewModel 的基类。

现在问题就出在这里,如果我有:

CreateMap<ArticleNewsItem, ArticleNewsItemDetailsViewModel>();

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

.ForMember(x => x.Property1, opt => opt.MapFrom(src => src.ArticleNewsItem.Property1)

我考虑过将所有属性从 ArticleNewsItemDetailsViewModel 移动到一个新的 View 模型中,并让该类成为 ArticleNewsItemDetailsViewModel 中的一个属性,只要这两者之间存在映射objects 然后它会工作,但感觉不是很干净。

有什么办法可以避免这种情况吗?

最佳答案

假设您有以下类(class):

    public class Article
{
public string Prop1 { get; set; }
public string Prop2 { get; set; }
public ArticleNewsItem ArticleNewsItem { get; set; }
}

public class ArticleDetailsViewModel
{
public string Prop1 { get; set; }
}

public class ArticleNewsItemDetailsViewModel : ArticleDetailsViewModel
{
public string Prop2 { get; set; }
public string Prop3 { get; set; }
}

public class ArticleNewsItem
{
public string Prop3 { get; set; }
}

映射应该如下所示:

var res = Mapper.Map<Article, ArticleNewsItemDetailsViewModel>(_article);
Mapper.Map(_article.ArticleNewsItem, res);

此外,您可以创建 custom type converter以避免每次需要将 Article 映射到 ArticleNewsItemDetailsViewModel 时都写这两行。

关于c# - AutoMapper继承和Linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13840184/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com