AutoMapper Сопоставить все свойства на основе значения другого свойства - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть следующий сценарий:

Исходный класс:

   public class Source
    {
      public int? A { get; set; }

      public int? B { get; set; }

      public int? C { get; set; }
    }

Класс назначения:

 public class Destination
    {
        public int A { get; set; }

        public bool AIsNull { get; set; }

        public int B { get; set; }

        public bool BIsNull { get; set; }

        public int C { get; set; }

        public bool CIsNull { get; set; }
    }

Я бы хотел получить отображение из Source => Destion следующим образом:

  • попытаться установить свойство назначения со связанным свойством источника (это можно сделать с помощью конвертера (реализующего ITypeConverter)
  • после того, как свойство установлено, я хочу установить целевое свойство IsNull, связанное с исходным свойством.

РЕДАКТИРОВАТЬ, после некоторых исследований:

  class Program
{
    static void Main(string[] args)
    {
        var srcClass = new SourceClass { Value1 = 10, Value2 = null, Value3 = 20 };

        Mapper.Initialize(cfg =>
        {
            cfg.ClearPrefixes();
            cfg.RecognizePostfixes("IsNull");
            cfg.CreateMap<SourceClass, TargetClass>();
        });

        var targetClass = Mapper.Map<SourceClass, TargetClass>(srcClass);

    }
}

public class SourceClass
{
    public int? Value1 { get; set; }
    public int? Value2 { get; set; }
    public int? Value3 { get; set; }
}

public class TargetClass
{
    public bool Value1IsNull { get; set; }
    public bool Value2IsNull { get; set; }
    public bool Value3IsNull { get; set; }
}

и все же, волшебства не бывает для этого случая

1 Ответ

0 голосов
/ 09 ноября 2018

Я думаю, что-то вроде этого должно работать, я не проверял это в VS, так что используйте с зерном соли.

var map = CreateMap<Source,Target>();

map.ForAllMembers(opt => opt.Ignore());

map.ForMember(dest => dest.A, opt => opt.MapFrom( src => src.A.HasValue ? src.A.Value : 0));

map.ForMember(dest => dest.AIsNull, opt => opt.MapFrom( src => src.A.HasValue ? true : false));
...