AutoMapper:网站IValueFormatter的广泛使用给定类型(AutoMapper :

2019-10-21 13:19发布

这是我的理解,我可以通过以下方式和映射应该格式化所有源模型日期在IValueFormatter定义的规则和结果集映射模型过程中配置AutoMapper。

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

Answer 1:

我有同样的问题,并找到了解决。 尝试改变:

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

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


Answer 2:

仅供参考 - 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();
    }
}


Answer 3:

我使用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));

}



文章来源: AutoMapper : Site wide usage of IValueFormatter for given types