2013-05-02 4 views
4

У меня есть ситуация, когда мои DTO требуют DateTime свойств, но мои POCOs используют значения с нулевым значением. Чтобы не создавать ForMember сопоставлений для каждого свойства с этим условием, я создал ITypeConverter<DateTime?, DateTime>. Проблема, с которой я столкнулся, заключается в том, что как DTO, так и POCO имеют значение NULL, допускающее нулевое значение, которое вызывается этим конвертером. Значение DestinationType равно DateTime, хотя свойство равно NULL. Любая идея, как я буду делать этот конвертер работать только для фактических нулевых datetimes?Nullable datetime to datetime converter automapper

public class FooDTO 
{ 
    public DateTime? FooDate { get; set; } 
} 

public class FooPoco 
{ 
    public DateTime? FooDate { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Mapper.CreateMap<FooDTO, FooPoco>(); 
     Mapper.CreateMap<DateTime?, DateTime>() 
       .ConvertUsing<NullableDateTimeConverter>(); 
     var poco = new FooPoco(); 
     Mapper.Map(new FooDTO() { FooDate = null }, poco); 

     if (poco.FooDate.HasValue) 
      Console.WriteLine(
       "This should be null : {0}", 
       poco.FooDate.Value.ToString()); //Value is always set 
     else 
      Console.WriteLine("Mapping worked"); 
    } 
} 

public class NullableDateTimeConverter : ITypeConverter<DateTime?, DateTime> 
{ 
    // Since both are nullable date times and this handles converting 
    // nullable to datetime I would not expect this to be called. 
    public DateTime Convert(ResolutionContext context) 
    { 
     var sourceDate = context.SourceValue as DateTime?; 
     if (sourceDate.HasValue) 
      return sourceDate.Value; 
     else 
      return default(DateTime); 
    } 
} 

Я нашел этот пост AutoMapper TypeConverter mapping nullable type to not-nullable type, но это мало помогает.

ответ

6

Не смотря, я подозреваю, что он вызвал ваш TypeCoverter, потому что он наилучшим образом подходит для преобразованных типов.

Если вы создаете еще один TypeConverter с правильными типами, он должен работать нормально. Например:

public class DateTimeConverter : ITypeConverter<DateTime?, DateTime> 
{ 
    public DateTime Convert(ResolutionContext context) 
    { 
     var sourceDate = context.SourceValue as DateTime?; 
     if (sourceDate.HasValue) 
      return sourceDate.Value; 
     else 
      return default(DateTime); 
    } 
} 

public class NullableDateTimeConverter : ITypeConverter<DateTime?, DateTime?> 
{ 
    public DateTime? Convert(ResolutionContext context) 
    { 
     var sourceDate = context.SourceValue as DateTime?; 
     if (sourceDate.HasValue) 
      return sourceDate.Value; 
     else 
      return default(DateTime?); 
    } 
} 

Обратите внимание, что если вы хотите это может быть еще более упрощен до

public class DateTimeConverter : TypeConverter<DateTime?, DateTime> 
{ 
    protected override DateTime ConvertCore(DateTime? source) 
    { 
     if (source.HasValue) 
      return source.Value; 
     else 
      return default(DateTime); 
    } 
} 

public class NullableDateTimeConverter : TypeConverter<DateTime?, DateTime?> 
{ 
    protected override DateTime? ConvertCore(DateTime? source) 
    { 
     return source; 
    } 
} 

Тогда просто инициализируется как преобразователи:

Mapper.CreateMap<DateTime?, DateTime>().ConvertUsing<DateTimeConverter>(); 
Mapper.CreateMap<DateTime?, DateTime?>().ConvertUsing<NullableDateTimeConverter>(); 
Mapper.AssertConfigurationIsValid(); 
+0

Yup, что сделал это. хоки, но работает. Спасибо за вашу помощь. – JSessions

+0

Вы должны иметь возможность упростить его немного дальше, если хотите, и встроить 'NullableDateTimeConverter' в' CreateMap'. Было не так много, чтобы выиграть, поэтому я не беспокоился, но мог бы сделать это немного меньше * hokie * :) – Mightymuke

Смежные вопросы