映射
您可以使用在映射对象时传递的解析上下文字典。这要比在映射后仅分配一个字段要难以维护和调试。如果源类之外有新字段被分配,您还可以考虑为两个源类创建两个映射。话虽如此,以下是代码:
映射类:
Mapper.CreateMap<Src, Dest>()
.ForMember(dest => dest.Param
, opt => opt.ResolveUsing((src, dest, destMember, resContext)
=> src.Param = resContext.Items["item"]));
您还可以将字典传递给嵌套对象映射,作为映射器对象,并且可以通过解析上下文访问字典。
Mapper.CreateMap<Src, Dest>()
.ForMember(dest => dest.Param
, opt => opt.ResolveUsing((src, dest, destMember, resContext)
=> resContext.Mapper.Map<NestedDestClass>(src, opts =>
{
opts.Items["item"] = resContext.Items["item"];
}
)));
映射对象
var dto = Mapper.Map<Dest>(item,
opts => opts.Items["item"] = "somevalue")
这里是一个fiddle
ProjectTo
在使用 ProjectTo 映射时,您可以使用字典。为此,您必须指定映射定义,在该定义中创建运行时参数,然后在执行时提供它。
要使用运行时参数创建映射定义,我们需要“伪造”一个闭包,其中包含一个命名的局部变量。我们无法在配置中访问执行期间使用的“真实”值,因此我们创建一个替代品,仍然为我们创建闭包。构建的基础表达式树会识别此外部输入,并创建占位符参数以在运行时提供。
var configuration = new MapperConfiguration(cfg =>
string name = null;
cfg.CreateMap<Dest, Source>()
.ForMember(m => m.CurrentUserName, opt => opt.MapFrom(src => name))
));
执行投影操作时,我们可以使用字典来提供参数值(关于使用匿名对象的示例,请参见
文档)。
data.ProjectTo<OrderLineDTO>(configuration, new Dictionary<string, object> {["name"] = "test"}).ToList()
当底层的LINQ提供程序执行投影时,将正确的运行时值替换在表达式中,使您能够在投影中使用每个映射的运行时值。您可以在任何基于表达式的配置选项中使用这些运行时值。