2017-02-21 3 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); 

    } 
}