我的理解是我可以通过以下方式配置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();
}
}
答案 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));
}