我想将参数传递给映射,因此它会根据该参数确定一个值。
一个简单的类
public class Person
{
string Name;
}
及其DTO
public class PersonDTO
{
string Name;
string IsAProgrammer;
}
我想要这样的东西
var parameterIsTrue = true; // how do I pass this value?
CreateMap<MyClassDTO, MyClass>()
.ForMember(x => x.Name, opt => opt.MapFrom(src => src.Name))
.ForMember(x => x.IsAProgrammer,
opt => opt.MapFrom(parameterIsTrue ? "sure!" : "nope"));
编辑
我正在尝试编写自定义解析器,但无法确定如何将参数传递给它。我想出了如何制作解析器的方法:
public class PersonResolver : IValueResolver<Person, PersonDTO, string>
{
...
public string Resolve(Person src,
PersonDTO dest,
string destMember,
ResolutionContext context)
{
return (bool) context.Items["isProgrammer"] ? "sure!" : "nope";
}
}
但是映射仍然失败:
CreateMap<MyClassDTO, MyClass>()
.ForMember(x => x.Name, opt => opt.MapFrom(src => src.Name))
.ForMember(x => x.IsAProgrammer,
opt => opt.ResolveUsing(PersonResolver)); // what ???
// how do I pass the context?
[您大约占95%。假设条件称为"canCode"
,则解析器如下所示:
public class ProgrammerResolver : IValueResolver<object, object, string>
{
public string Resolve(object s, object d, string dm, ResolutionContext ctx)
{
return ((bool)ctx.Items["canCode"]) ? "Yes" : "No";
}
}
并像这样使用它:
var mapper = new MapperConfiguration(cfg => {
cfg.CreateMap<Person, PersonDTO>()
.ForMember(d => d.Name, opt => opt.MapFrom(s => s.Name))
.ForMember(d => d.IsAProgrammer,
opt => opt.ResolveUsing<ProgrammerResolver>());
}).CreateMapper();
var src = new Person();
// This is how you pass your custom values in
var dto1 = mapper.Map<PersonDTO>(src, opt => opt.Items["canCode"] = false);
var dto2 = mapper.Map<PersonDTO>(src, opt => opt.Items["canCode"] = true);
Debug.WriteLine($"{dto1.IsAProgrammer}, {dto2.IsAProgrammer}"); // No, Yes