AutoMapper: 将对象集合映射为字符串集合

16

我需要关于AutoMapper的一种特殊映射的帮助。我想要将一个对象集合映射到一个字符串集合。

因此,我有一个Tag类。

public class Tag
{
    public Guid Id { get; set; }
    public string Name {get; set; }
}

在我的模型中,我有一个该类的IList列表。现在我想将名称映射到一个字符串集合。

这就是我定义映射规则的方式:

.ForMember(dest => dest.Tags, opt => opt.ResolveUsing<TagNameResolver>())

这是我的ValueResolver:

protected override string ResolveCore(Tag source)
{
    return source.Name;
}

但是你知道...它不起作用;-) 所以也许有人知道如何正确地做,可以帮助我。

谢谢

更新至Jan

所以...你想要更多细节..那么这里是..但我已经缩短了它;)

所以这个模型:

public class Artocle
{
    public Guid Id { get; set; }
    public string Title {get; set; }
    public string Text { get; set; }
    public IList<Tag> Tags { get; set; }
}

你可以看到上面的标签模型。

我想将它映射到ArticleView......我只需要标签模型在某些业务上下文中使用,而不是用于输出。

这是我需要映射到的ViewModel:

public class ArticleView
{
    public Guid Id { get; set; }
    public string Title { get; set; }
    public string Text { get; set; }
    public IList<string> Tags { get; set; } // The mapping problem :-)
}

所以我有一个用于映射的 BootStrapper。我的映射看起来像这样:

Mapper.CreateMap<Article, ArticleView>()
.ForMember(dest => dest.Tags, opt => opt.ResolveUsing<TagNameResolver>())

我使用一种特殊的方法手动映射它

    public static ArticleView ConvertToArticleView(this Article article)
    {
        return Mapper.Map<Article, ArticleView>(article);
    }

你能提供更多关于源类和目标类的信息吗? - Ed Charbeneau
这就是我所做的一切 :) 我希望我的修改能够有所帮助 :) - Smokefoot
1个回答

33
一项单元测试验证了以下内容会从IList<Tag>映射到IList<string>
  private class TagNameResolver : ValueResolver<IList<Tag>, IList<string>>
        {
            protected override IList<string> ResolveCore(IList<Tag> source)
            {
                var tags = new List<string>();
                foreach (var tag in source)
                {
                    tags.Add(tag.Name);
                }
                return tags;
            } 
        }

这是创建地图的简短方式:
.ForMember(dest => dest.Tags, opt => opt.MapFrom(so => so.Tags.Select(t=>t.Name).ToList()));

1
该死..这么简单^^非常感谢,我没有想到过这种方法:D 羞愧 - Smokefoot
1
哦,你的第二个选项很棒。非常感谢你。 - Smokefoot
1
好的答案经得起时间的考验!顺便说一下,我试图将一个字符串列表映射到一个映射对象的子属性上,所以我使用了 ForPath,像这样:.ForPath(d => d.Person.Name, opt => opt.MapFrom(o => o.PersonComplaint.Select(t => t.Complainer.ToString()).ToList())) - 和 @EdCharbeneau 建议的查询相同,但是使用了不同的方法。 - dstewart101

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接