自动映射:接口属性的格式化程序

时间:2010-07-30 19:06:38

标签: interface 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”,则PostViewModel的{​​{1}}属性应包含字符串“foo,bar”。 Tags应保持为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>());
}

1 个答案:

答案 0 :(得分:0)

这不是我要问的问题的答案,而是解决问题的方法:

我构建了一个TagsFormatter,用于检查“Tags”的属性名称:

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();
    }
}

在配置中,我可以为所有映射注册此Formatter:

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

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