1

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

为此,我使用了自定义值解析器,并在解析期间发布了一个日志事件。作为此消息的一部分,我想知道正在映射的目标成员,我希望在source.Context.MemberName中找到它- 但这始终为空。

值解析器:

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 代码中看到 MemberName 仅在 PropertyMap 为非 null 时才返回,并且由于在这种情况下 PropertyMap 为 null,我没有取回 MemberName。

此处未定义 PropertyMap 是否有原因?通过source.Context.TypeMap.GetPropertyMaps()有一个相关的候选人,但它没有被推送到这个上下文中。

有任何想法吗?也许有一种方法可以将正确的 PropertyMap 从 Context.TypeMap 集中拉出来?

4

1 回答 1

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) )
于 2013-07-31T17:21:50.097 回答