Типы объектов сопоставления AutoMapper - PullRequest
0 голосов
/ 08 июля 2020

Я имею дело с действительно ужасным набором сгенерированных классов, которые имеют массу свойств типа object, которые содержат различные типы, которые я хочу сопоставить. Сопоставления классов, похоже, работают, однако ссылки на свойства просто копируются напрямую без сопоставления объектов, на которые имеются ссылки.

Как я могу определить карту, которая сопоставит объекты внутри свойства Items? У меня есть масса подобных объектов, поэтому надеюсь, что я смогу определить это довольно просто ...

Пример:

    class Program
{
    static void Main(string[] args)
    {
        var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<TerribleType1, TerribleType1Dto>();
            cfg.CreateMap<TerribleType2, TerribleType2Dto>();
            cfg.CreateMap<TerribleObject, TerribleObjectDto>();
        });

        var mapper = config.CreateMapper();
        var terribleObject = new TerribleObject
        {
            Items = new object[] { new TerribleType1 { PropA = "Test1" }, new TerribleType2 { PropA = "Test2" } }
        };

        var terribleObjectDto = mapper.Map<TerribleObjectDto>(terribleObject);
        
        //Want a TerribleType1Dto but instead I get a TerribleType1
        Console.WriteLine(terribleObjectDto.Items[0].GetType().Name);
    }
}

class TerribleObject
{
    // Contains some TerribleType1 and TerribleType2 objects, these don't share a common base.
    public object[] Items { get; set; }
}

class TerribleObjectDto
{
    //Want this to have some TerribleType1Dto and TerribleType2Dto objects.
    public object[] Items { get; set; }
}

public class TerribleType1
{
    public string PropA { get; set; }
}

public class TerribleType1Dto
{
    public string PropA { get; set; }
}

public class TerribleType2Dto
{
    public string PropA { get; set; }
}

public class TerribleType2
{
    public string PropA { get; set; }
}

1 Ответ

0 голосов
/ 08 июля 2020

На основе Как я могу использовать Automapper для сопоставления объекта с неизвестным типом назначения? можно получить настроенный тип назначения для сопоставления, если вы знаете тип источника только во время выполнения. С помощью MapFrom() можно построить это уродливое сопоставление для объектов внутреннего типа object:

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<TerribleType1, TerribleType1Dto>();
    cfg.CreateMap<TerribleType2, TerribleType2Dto>();
    cfg.CreateMap<TerribleObject, TerribleObjectDto>()
       .ForMember(t => t.Items, m => m.MapFrom((source, target, data, context) =>
       {
           object[] items = source.Items;
           object[] targetArray = new object[items.Length];
           for (int i = 0; i < items.Length; i++)
           {
               object fieldEntry = items[i];
               Type destinationType = context.Mapper.ConfigurationProvider
                   .GetAllTypeMaps()
                   .Single(it => it.SourceType == fieldEntry.GetType())
                   .DestinationType;
               targetArray[i] = context.Mapper.Map(fieldEntry,
                                                   fieldEntry.GetType(), 
                                                   destinationType);
           }
           return targetArray;
       }));
});

Это преобразует каждый object в массиве в настроенный тип назначения. Когда вы запустите свой код сейчас:

Console.WriteLine(terribleObjectDto.Items[0].GetType().Name);
Console.WriteLine(terribleObjectDto.Items[1].GetType().Name);

, вы получите следующий результат:

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