2011-07-21 101 views
6

我需要使用AutoMapper进行特殊映射的帮助。我想将一组对象映射到一组字符串。AutoMapper:将Object的集合映射到字符串集合

所以我有一个标签D类

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 ... u想更多的细节。这里u得到它..但我有缩短;)

所以型号:

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 ...我只需要标记模型用于某些业务环境,而不是用于输出。

因此,这里的视图模型我需要映射到:

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 :-) 
} 

所以,我对于映射一个引导程序。我的映射是这样的:

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); 
    } 
+0

你能提供更多关于源和目标类的信息吗? –

+0

这就是我所做的:)我希望我的版本可以帮助:) – Smokefoot

回答

13

manuelly它映射单元测试验证,以下将映射自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

该死的..它的这么容易^^非常感谢你对这种方式havnt思想:D *耻辱* – Smokefoot

+0

欢迎您。我也添加了一个简短的选项。 –

+1

哦,你的第二个选择是伟大的。非常感谢你。 – Smokefoot