Обработка нескольких сопоставлений для одного и того же исходного и целевого объектов - PullRequest
0 голосов
/ 03 марта 2020

У меня есть Исходный класс и Целевой класс для сопоставления. Целевой класс - это обобщенный c класс, такой как Person, который будет использоваться в качестве поля в одном из моих классов (MainClass) в различных областях, например, Отец, Мать, Брат и т. Д. c. Как я могу отобразить данные, поступающие из источника в место назначения, которые есть для Отца, Матери и т. Д. c.

Я могу создать

CreateMap<Source, MainClass>()
.ForMember(dest => dest.Mother, m => m.MapFrom(source => source))
.ForMember(dest => dest.Father, m => m.MapFrom(source => source))
.ForMember(dest => dest.Brother, m => m.MapFrom(source => source));

 Mapper.CreateMap<Source, Destination>()  
.ForMember(dest => dest.Name,  m => m.MapFrom(source => source.motherName))
.ForMember(dest => dest.ID,  m => m.MapFrom(source => source.motherId))
.ForMember(dest => dest.Address,  m => m.MapFrom(source => source.motherAddress));

, но как я могу обработать отображение для отца, брата и др c. достичь

 Mapper.CreateMap<Source, Destination>()  
.ForMember(dest => dest.Name,  m => m.MapFrom(source => source.FatherName))
.ForMember(dest => dest.ID,  m => m.MapFrom(source => source.FatherId))
.ForMember(dest => dest.Address,  m => m.MapFrom(source => source.FatherAddress));

1 Ответ

0 голосов
/ 03 марта 2020

Хорошо, так что это непроверенный код из редактора блокнота: D

Вы можете попробовать это и изменить его так, как вам нужно. Это не будет работать с самого начала!

opt.MapFrom (source => SetName (source, "Mother")))

    private object SetName(Person y, string personState)
    {
        Person person = new Person();
        var properties = DictionaryFromType(y);
        foreach(var property in properties)
        {
            if(property.Key.ToLower().Contains(personState.ToLower()))
            {
     // you should make the real mapping to id here. This is just example code on how it could work
                PropertyInfo propertyInfo = person.GetType().GetProperty(property.Key);
                propertyInfo.SetValue(person, Convert.ChangeType(property.Value, propertyInfo.PropertyType), null);
            }
        }

        return person;
    }

    public static Dictionary<string, object> DictionaryFromType(object atype)
    {
        if (atype == null) return new Dictionary<string, object>();
        Type t = atype.GetType();
        PropertyInfo[] props = t.GetProperties();
        Dictionary<string, object> dict = new Dictionary<string, object>();
        foreach (PropertyInfo prp in props)
        {
            object value = prp.GetValue(atype, new object[] { });
            dict.Add(prp.Name, value);
        }
        return dict;
    }

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

Возможно, есть более лучшие решения с автопроизводителем, но я только думал об этом на данный момент.

Надеюсь, это поможет вам, даже если это не законченный ответ! (Извините, у меня мало времени)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...