public class Foo
{
public string Baz { get; set; }
public List<Bar> Bars { get; set; }
}
当我映射上面的类时,有什么方法可以定义我希望 automapper 映射对象的深度?我所追求的一些伪代码:
var mapped = Mapper.Map<FooDTO>(foo, opt => { levels: 0 });
// result = { Baz: "" }
var mapped = Mapper.Map<FooDTO>(foo, opt => { levels: 1 });
// result = { Baz: "", Bars: [{ Blah: "" }] }
var mapped = Mapper.Map<FooDTO>(foo, opt => { levels: 2 });
// result = { Baz: "", Bars: [{ Blah: "", Buzz: [{ Baz: "" }] }] }
// etc...
由于 nuget 依赖性,我目前正在使用 automapper 3.3。
最佳答案
您可以通过在运行时提供一个值来做到这一点,正如所回答的那样: How to ignore a property based on a runtime condition? 。
配置:
Mapper.CreateMap<Foo, FooDTO>().ForMember(e => e.Bars,
o => o.Condition(c => !c.Options.Items.ContainsKey("IgnoreBars")));
用法:
Mapper.Map<FooDTO>(foo, opts => { opts.Items["IgnoreBars"] = true; });
您可以将相同的配置方法应用于您调用级别的所有嵌套对象。
如果您想为您的数据库实体实现相同的行为,您可以使用
ExplicitExpansion
方法,如本答案中所述: Is it possible to tell automapper to ignore mapping at runtime? 。配置:
Mapper.CreateMap<Foo, FooDTO>()
.ForMember(e => e.Bars, o => o.ExplicitExpansion());
用法:
dbContext.Foos.Project().To<FooDTO>(membersToExpand: d => d.Bars);
关于c# - AutoMapper 定义映射级别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44353062/