2017-02-21 19 views
0

Я отображение значений с Automapper именами свойств, как это:Пользовательского значение обработки при сопоставлении по именам свойств с помощью Automapper

.ForMember(dstPropName, a => a.MapFrom(srcPropName)); 

есть способ для значений обработки пользовательских полученных из источника? Например, я хотел бы обрезать строки.

Я делаю преобразователь данных, который должен принимать очень разные типы данных, а вызывающий абонент предоставляет только имена столбцов (это требуется задаче). Я понятия не имею, как перехватывать полученные ценности и что-то делать с ними.

+0

пользовательский вариант «ITypeConverter» может быть? –

ответ

0

Хорошо, я нашел решение! IMemberValueResolver - это то, что мне нужно.

public class Source 
{ 
    public string Text { get; set; } 
    public string TextTime { get; set; } 
} 

public class Destination 
{ 
    public string Message { get; set; } 
    public DateTime? CreatedOn { get; set; } 
} 

public class DateTimeResolver : IMemberValueResolver<object, object, object, object> 
{ 
    private readonly string _format; 

    public DateTimeResolver(string format) 
    { 
     _format = format; 
    } 

    public object Resolve(object source, object destination, object sourceMember, object destMember, ResolutionContext context) 
    { 
     DateTime dt; 
     return DateTime.TryParseExact(sourceMember.ToString(), _format, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt) ? dt : (DateTime?) null; 
    } 
} 

    private static void Main(string[] args) 
    { 

     Source src = new Source() 
     { 
      Text = " message with spaces ", 
      TextTime = "04/22/1988" 
     }; 

     DateTimeResolver dtReader = new DateTimeResolver("MM/dd/yyyy"); 

     Mapper.Initialize(cfg => 
      cfg.CreateMap(typeof (Source), typeof (Destination)) 
       // type resolver 
       .ForMember("Message", opt => opt.ResolveUsing<TrimResolver, object>("Text")) 
       // instance resolver 
       .ForMember("CreatedOn", opt => opt.ResolveUsing(dtReader, "TextTime"))); 

     Destination dst = Mapper.Map<Destination>(src); 

    } 
}