2010-07-30 39 views
1

如果我有一些實現相同接口的類,那麼它們都包含相同的屬性。有沒有辦法將格式化程序添加到這些屬性?我只找到了將格式化程序添加到特定屬性類型的可能性。Automapper:接口屬性的格式化

下面是一些代碼,應該澄清我的意思:

public interface ITaggable 
{ 
    IList<string> Tags { get; set; } 
} 

public class Post : ITaggable 
{ 
    public IList<string> Tags { get; set; } 
    public IList<string> Categories { get; set; } 
    ... 
} 

public class Page : ITaggable 
{ 
    public IList<string> Tags { get; set; } 
    .... 
} 

我想映射這些以查看模式,看起來像這樣:

public class PostViewModel 
{ 
    public string Tags { get; set; } 
    public IList<string> Categories { get; set; } 
    ... 
} 

public class PageViewModel 
{ 
    public string Tags { get; set; } 
    ... 
} 

如果Post有標籤「foo」和「bar」,那麼PostViewModelTags屬性應該包含字符串「foo,bar」。 Categories應保持爲IList<string>

我可以創建自定義格式實現這一點,然後將其添加在每一個映射,像這樣:

protected override void Configure() 
{ 
    CreateMap<Post, PostViewModel>() 
     .ForMember(x => x.Tags, opt => opt.AddFormatter<TagsFormatter>()); 
    CreateMap<Page, PageViewModel>() 
     .ForMember(x => x.Tags, opt => opt.AddFormatter<TagsFormatter>()); 
} 

但我想這樣做(此代碼不能正常工作; - )

protected override void Configure() 
{ 
    ForSourceType<ITaggable>() 
     .ForMember(x => x.Tags, opt => opt.AddFormatter<TagsFormatter>()); 

    CreateMap<Post, PostViewModel>(); 
    CreateMap<Page, PageViewModel>(); 
} 
+0

試試這個http://valueinjecter.codeplex.com/,這是一個完全不同的方法到映射,你可以想象一個界面,它仍然可以工作(你自己做慣例) – Omu 2010-08-02 10:38:42

+0

感謝您的建議。我會看看它。 – davehauser 2010-08-03 18:39:57

回答

0

它不完全的答案,我問的問題,但這個問題的解決方案:

我建了一個TagsFormatter,檢查正確的名稱TY爲「標籤」:

public class TagsFormatter : IValueFormatter 
{ 
    public string FormatValue(ResolutionContext context) 
    { 
     if (context.MemberName.Equals("Tags", StringComparison.InvariantCultureIgnoreCase)) 
     { 
      var tags = context.SourceValue as IList<string>; 
      if (tags != null) 
       return String.Join(", ", tags); 
     } 
     return context.SourceValue.ToString(); 
    } 
} 

在配置然後我就可以註冊這個格式化所有映射:

public class ViewModelProfile : AutoMapper.Profile 
{ 
    protected override void Configure() 
    { 
     ForSourceType<IList<string>>().AddFormatter<TagsFormatter>(); 

     CreateMap<Post, PostViewModel>(); 
     CreateMap<Page, PageViewModel>(); 
    } 
}