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/

10-14 16:33