Условное отображение из параметра в Automapper - PullRequest
2 голосов
/ 21 октября 2019

Я хочу передать параметр в отображение, чтобы он определял значение на основе этого параметра.

Простой класс

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?

1 Ответ

0 голосов
/ 23 октября 2019

Ты там на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...