2013-07-31 17 views
1

我需要跟蹤項目中的任何複雜(即非默認)映射。從自動映射器自定義ValueResolver中的ResolutionContext訪問MemberNameName/PropertyMap

爲了實現這一點,我使用了自定義值解析器,並在解析過程中發佈了一個日誌事件。作爲此消息的一部分,我想知道目標成員正在映射,我希望在source.Context.MemberName中找到 - 但這總是空。

ValueResolver:

public class Resolver : IValueResolver 
{ 

    public event MappingEventHandler MappingEvent; 
    public delegate void MappingEventHandler(MappingMessage m); 

    public ResolutionResult Resolve(ResolutionResult source) 
    { 
     var src = (SourceDTO)source.Context.SourceValue; 

     if (!String.IsNullOrWhiteSpace(src.Status) && src.Status == "Alert") 
     { 
      var newValue = source.Value + " - Fail"; 
      var fieldName = source.Context.MemberName; //Always null 

      MappingEvent(new MappingMessage(fieldName , newValue)); 

      return source.New(value, typeof(String)); 
     } 

     return source; 
    } 
} 

......及其用法:

Resolver resolver = new Resolver(); 

//... subscribe to resolver events etc. 

Mapper.CreateMap<SourceDTO, Common>() 
     .ForMember(dest => dest.ReferenceIdentifier 
       , opt => opt.ResolveUsing<Resolver>() 
          .FromMember(src => src.Reference) 
          .ConstructedBy(() => resolver) 

我可以在Automapper代碼,如果屬性映射非空即成員名稱只返回看到,並且由於在這種情況下PropertyMap爲null,所以我沒有取回我的MemberName。

有沒有一個原因的PropertyMap是不是在這裏定義?有一個相關候選人通過source.Context.TypeMap.GetPropertyMaps(),但它沒有被推入到這個上下文中。

任何想法?也許有一種方法將正確的PropertyMap拉出Context.TypeMap集?

回答

0

嘗試使用最近的Automapper構建 - 看起來問題已解決。

版本有問題:2.1.266

工作版本:2.2.1

還發現它是一個更容易使用以下語法從現有實例解析:

Resolver resolver = new Resolver(); 

//... subscribe to resolver events etc. 

Mapper.CreateMap<SourceDTO, Common>() 
         .ForMember(dest => dest.ReferenceIdentifier 
           , opt => opt.ResolveUsing(resolver) 
              .FromMember(src => src.Reference))