AutoMapper:将Object的集合映射到字符串集合

时间:2011-07-21 19:42:57

标签: c# asp.net automapper

我需要帮助使用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;
}

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

thx很多

Sooo ..你想要更多细节..在这里你得到它......但我缩短了它;)

所以模型:

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

你可以看到Tag模型。

我想将它映射到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>())

我用一种特殊的方法将它绘制成manuelly

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

1 个答案:

答案 0 :(得分:18)

单元测试验证以下内容将从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()));