从Automapper自定义ValueResolver中的ResolutionContext访问MemberName / PropertyMap

时间:2013-07-31 14:12:52

标签: automapper

我需要在项目中跟踪任何复杂(即非默认)映射。

为实现这一目标,我正在使用自定义值解析器,并在解析期间发布日志事件。作为此消息的一部分,我想知道正在映射的目标成员,我希望在 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集中拉出来?

1 个答案:

答案 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) )