AutoMapper - 包含忽略相同命名属性的IncludeBase

时间:2016-02-17 13:41:07

标签: c# automapper

我正在尝试使用IncludeBase。它似乎在基类上具有相同的命名属性的问题。这些不包括在基本映射中,而是自动解析。我正在使用automapper版本4.2。

与此类似的情况:

class Program
{
    static void Main(string[] args)
    {
        MapperConfiguration conf = new MapperConfiguration((cfg) =>
        {
            cfg.CreateMap<FooBase, FooModelBase>()
                .ForMember(e => e.Error, opt => opt.Ignore());

            cfg.CreateMap<Foo, FooModel>()
                .IncludeBase<FooBase, FooModelBase>();
        });

        IMapper mapper = conf.CreateMapper();

        //works just fine
        FooModelBase fooModelBase = mapper.Map<FooModelBase>(new FooBase());

        //throws an exception
        FooModel fooModel = mapper.Map<FooModel>(new Foo());
    }
}

class FooBase 
{
    public string Error { get; set; }
}

class Foo : FooBase { }

class FooModelBase 
{
    public string Error
    {
        get { throw new NotImplementedException(); }
        set { throw new NotImplementedException(); }
    }
}

class FooModel : FooModelBase { }

我曾预料到,该应用程序不会抛出异常,但确实如此。有什么建议如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

这里的关键是 AutoMapper 如何确定继承映射的可能来源的优先级

正如您在 Automapper GitHub Project 中的this link中所看到的,当您包含继承的映射时,会引入额外的复杂性,因为可以通过多种方式映射属性。

这些来源的优先顺序如下:

  1. 显式映射(使用.MapFrom()
  2. 继承的显式映射
  3. 忽略属性映射
  4. 约定映射(通过约定匹配的属性)
  5. 所以&#39;继承忽略属性映射&#39;被忽略或优先级较低。

    这里发生的事情就是&#39;会议制图&#39;具有更高的优先级,因此属性仍然被映射。

    您可以解决此问题,在派生地图配置中明确添加Ignore()

    cfg.CreateMap<Foo, FooModel>()
        .ForMember(e => e.Error, opt => opt.Ignore())
        .IncludeBase<FooBase, FooModelBase>();