如何为单个类的单个DateTime属性重写AutoMapper类型转换器?
针对单个DateTime属性重写AutoMapper转换器的解决方案
你可以通过针对特定类映射的单个属性单独配置转换规则来实现需求,AutoMapper中成员级的配置优先级高于全局类型转换器,不需要修改全局规则或编写遍历所有转换的转换器。具体步骤如下:
1. 新建保留时间的UTC转换器
创建一个专门处理带时间UTC转换的类型转换器,区别于你全局使用的仅保留日期的转换器:
public class DateTimeConverterWithUtcTime : ITypeConverter<DateTime, DateTime> { public DateTime Convert(DateTime source, DateTime destination, ResolutionContext context) { // 将源时间转换为UTC格式,保留完整的日期和时间部分 return DateTime.SpecifyKind(source, DateTimeKind.Utc); } }
2. 在类映射中为目标属性指定新转换器
假设你需要处理的类是SourceClass(源类型)和TargetClass(目标类型),目标类的特殊属性是SpecialDateTime,在创建这两个类的映射时,用ForMember方法单独为该属性配置转换器:
// 全局的DateTime转换器保持不变 this.CreateMap<DateTime, DateTime>().ConvertUsing(new DateTimeConverterForUniversalTime()); // 针对特定类的映射,单独配置目标属性的转换器 this.CreateMap<SourceClass, TargetClass>() .ForMember(dest => dest.SpecialDateTime, opt => opt.ConvertUsing(new DateTimeConverterWithUtcTime()));
关于取出时转本地时间的补充
如果需要在反向映射(从数据库实体转DTO/本地模型)时将UTC时间转回本地时间,可以在反向映射中同样为该属性配置对应的转换器:
public class DateTimeConverterUtcToLocal : ITypeConverter<DateTime, DateTime> { public DateTime Convert(DateTime source, DateTime destination, ResolutionContext context) { // 将UTC时间转换为本地时间 return source.ToLocalTime(); } } // 添加反向映射配置 this.CreateMap<TargetClass, SourceClass>() .ForMember(dest => dest.SpecialDateTime, opt => opt.ConvertUsing(new DateTimeConverterUtcToLocal()));
这样既保留了全局DateTime转换器的作用,又单独为指定类的单个属性实现了特殊的转换规则,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Anthony
相关产品推荐
相关产品推荐

