Automapper中参数的条件映射

问题描述 投票:1回答:1

我想将参数传递给映射,因此它会根据该参数确定一个值。

一个简单的类

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?
c# mapping automapper dto automapper-5
1个回答
0
投票

[您大约占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
© www.soinside.com 2019 - 2024. All rights reserved.