我需要跟蹤項目中的任何複雜(即非默認)映射。從自動映射器自定義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集?