gpt4 book ai didi

c# - AutoMapper - IncludeBase 忽略相同的命名属性

转载 作者:行者123 更新时间:2023-11-30 23:29:24 27 4
gpt4 key购买 nike

我正在尝试使用 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 { }

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

最佳答案

这里的关键是 AutoMapper 如何优先考虑继承映射的可能来源

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

这些来源的优先级如下:

  1. 显式映射(使用 .MapFrom())
  2. 继承显式映射
  3. 忽略属性映射
  4. 约定映射(通过约定匹配的属性)

因此“Inherited Ignore Property Mapping”被忽略或具有较低的优先级。

这里发生的是“约定映射”具有更高的优先级,因此该属性仍然被映射。

您可以在派生 map 配置中显式添加 Ignore() 来解决此问题:

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

关于c# - AutoMapper - IncludeBase 忽略相同的命名属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35458344/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com