我需要在项目中跟踪任何复杂(即非默认)映射。
为实现这一目标,我正在使用自定义值解析器,并在解析期间发布日志事件。作为此消息的一部分,我想知道正在映射的目标成员,我希望在 source.Context.MemberName 中找到它 - 但这始终为null。
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非空,则MemberName仅返回,并且由于PropertyMap在这种情况下为null,所以我没有得到我的MemberName。
有没有理由在这里没有定义PropertyMap?通过 source.Context.TypeMap.GetPropertyMaps()有一个相关的候选者,但它没有被推入这个上下文。
有什么想法吗?也许有一种方法可以将正确的PropertyMap从Context.TypeMap集中拉出来?
答案 0 :(得分: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) )