C# 自动映射-将UTC转换为特定时区

C# 自动映射-将UTC转换为特定时区,c#,automapper,C#,Automapper,在将DateUtc从源代码转换为destDate时,我需要应用一个转换。现在,我编写的以下转换器将适用于特定字段,因为它是指定的 我希望我的转换器更灵活,可以传递另一个对象,而不是SourceDto1,DestDto1,例如SourceDto2和DestDto2 public class SourceDto1 { public DateTime DateUtc {get;set;} } public class DestDto1 { public DateTime Date {get

在将
DateUtc
从源代码转换为dest
Date
时,我需要应用一个转换。现在,我编写的以下转换器将适用于特定字段,因为它是指定的

我希望我的转换器更灵活,可以传递另一个对象,而不是
SourceDto1
DestDto1
,例如
SourceDto2
DestDto2

public class SourceDto1
{
   public DateTime DateUtc {get;set;}
}
public class DestDto1
{
   public DateTime Date {get;set;}
}
public class SourceDto2
{
   public DateTime DateUtc {get;set;}
}
public class DestDto2
{
   public DateTime Date {get;set;}
}
转换器

public class AttachmentCreatedDateResolver : IValueResolver<SourceDto1, DestDto1 DateTime>
    {

        private readonly Settings _settings;
        public AttachmentCreatedDateResolver(Settings settings)
        {
            _settings = settings;
        }


        public DateTime Resolve(SourceDto1 source, DestDto1 destination, DateTime destMember, ResolutionContext context)
        {
            TimeZoneInfo tzi = TZConvert.GetTimeZoneInfo(_settings.TimeZone);
            var converted = TimeZoneInfo.ConvertTimeFromUtc(source.DateUtc, tzi);
            return converted;
        }
    }
公共类附件CreateDDateResolver:IValueResolver
{
私人只读设置\u设置;
公共附件CreateDDateResolver(设置)
{
_设置=设置;
}
公共日期时间解析(SourceDto1源、DestDto1目标、DateTime destMember、ResolutionContext上下文)
{
TimeZoneInfo tzi=TZConvert.GetTimeZoneInfo(_settings.TimeZone);
var converted=TimeZoneInfo.ConvertTimeFromUtc(source.DateUtc,tzi);
转换收益;
}
}
我想我不想为每对需要在属性之间转换日期的对象创建不同的解析器类


ITypeConverter
可能会工作,但我不确定如何从DI注入我的
设置
您可以为此创建一个实现:

public class AttachmentCreatedDateResolver : IMemberValueResolver<object, object, DateTime, DateTime>
{
    private readonly Settings _settings;
    public AttachmentCreatedDateResolver(Settings settings)
    {
        _settings = settings;
    }

    public DateTime Resolve(object source, object destination, DateTime sourceMember, DateTime destMember, ResolutionContext context)
    {
        TimeZoneInfo tzi = TZConvert.GetTimeZoneInfo(_settings.TimeZone);
        var converted = TimeZoneInfo.ConvertTimeFromUtc(sourceMember, tzi);
        return converted;
    }
}

或者,如果源和目标连接,仍然可以使用
IValueResolver
。然后,映射可以是
CreateMap().ForMember(…).includealderived()
。这将涵盖所有正在实施的DTO。过去就是这样。但现在这个案例更加精简了。
CreateMap<SourceDto1, DestDto1>()
    .ForMember(d => d.Date, opt => opt.MapFrom<AttachmentCreatedDateResolver, DateTime>(s => s.DateUtc));
CreateMap<SourceDto2, DestDto2>()
    .ForMember(d => d.Date, opt => opt.MapFrom<AttachmentCreatedDateResolver, DateTime>(s => s.DateUtc));