2011-07-21 6 views
6

AutoMapperで特別なマッピングが必要です。私は、オブジェクトのコレクションを文字列のコレクションにマップしたいと思います。AutoMapper:Objectのコレクションを文字列のコレクションにマッピングする

だから私は、Tag iは、このクラスのIListのを持っているモデルよりも

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

をclassd持っています。今私は名前を文字列のコレクションにマップしたいと思います。

私はマッピングルールを定義する方法厥:

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

をそして、ここで私のValueResolverです..それはいけない仕事

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

しかし、uは知っている;-)ので、多分誰かが行う方法を知ってそれが正しいと私を助けることができます。

すっごく.. uはここでuはそれを得る...詳細を望んでいた..しかし、私はそれを短くしているたくさん

THX;)

だから、モデル:

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

そして、タグモデルuは上記を見ることができます。

私はそれを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 :-) 
} 

:だからここ

は私がにマップする必要がViewModelにあります。私のマッピングは次のようになります。

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>から<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; 
      } 
     } 

のIListにマップする次これは、地図を作成するより簡単な方法です。

.ForMember(dest => dest.Tags, opt => opt.MapFrom(so => so.Tags.Select(t=>t.Name).ToList())); 
+1

そんなに簡単です^^このように考えてくれてありがとうございました:D * shame * – Smokefoot

+0

ようこそ。私は短いオプションも追加しました。 –

+1

ああ、あなたの2番目のオプションは素晴らしいです。本当にありがとう。 – Smokefoot

関連する問題