AutoMapper:针对给定类型的IValueFormatter的站点范围使用

时间:2010-05-06 06:53:43

标签: configuration automapper

我的理解是我可以通过以下方式配置AutoMapper,并且在映射期间,它应将所有源模型日期格式化为IValueFormatter中定义的规则,并将结果设置为映射模型。

ForSourceType<DateTime>().AddFormatter<StandardDateFormatter>();
ForSourceType<DateTime?>().AddFormatter<StandardDateFormatter>();

我对此映射类没有任何影响。它仅在我执行以下操作时有效:

Mapper.CreateMap<Member, MemberForm>().ForMember(x => x.DateOfBirth, y => y.AddFormatter<StandardDateFormatter>());

我正在映射 DateTime? Member.DateOfBirth 字符串MemberForm.DateOfBirth 。格式化程序基本上从日期创建一个短日期字符串。

在为给定类型设置默认格式化程序时,是否存在我遗漏的内容?

由于

public class StandardDateFormatter : IValueFormatter
{
    public string FormatValue(ResolutionContext context)
    {
        if (context.SourceValue == null)
            return null;

        if (!(context.SourceValue is DateTime))
            return context.SourceValue.ToNullSafeString();

        return ((DateTime)context.SourceValue).ToShortDateString();
    }
}

3 个答案:

答案 0 :(得分:5)

我遇到了同样的问题并找到了解决办法。尝试更改:

ForSourceType<DateTime>().AddFormatter<StandardDateFormatter>();

Mapper.ForSourceType<DateTime>().AddFormatter<StandardDateFormatter>();

答案 1 :(得分:2)

FYI - AddFormatter方法在3.0版本中已过时。您可以改为使用ConvertUsing:

Mapper.CreateMap<DateTime, string>()
    .ConvertUsing<DateTimeCustomConverter>();

public class DateTimeCustomConverter : ITypeConverter<DateTime, string>
{
    public string Convert(ResolutionContext context)
    {
        if (context.SourceValue == null)
            return null;
        if (!(context.SourceValue is DateTime))
            return context.SourceValue.ToNullSafeString();
        return ((DateTime)context.SourceValue).ToShortDateString();
    }
}

答案 2 :(得分:1)

我正在使用AutoMapper v1。

那里有一个抽象类可以完成大部分名为ValueFormatter的繁琐工作。

我的代码:

public class DateStringFormatter : ValueFormatter<DateTime>
{
    protected override string FormatValueCore(DateTime value)
    {
        return value.ToString("dd MMM yyyy");
    }
}

然后在我的个人资料类中:

public sealed class ViewModelMapperProfile : Profile
{
    ...

    protected override void Configure()
    {
        ForSourceType<DateTime>().AddFormatter<DateStringFormatter>();

        CreateMap<dto, viewModel>()
            .ForMember(dto => dto.DateSomething, opt => opt.MapFrom(src => src.DateFormatted));

}