Подтвердить что ты не робот

Automapper устанавливает свойство массива в массив нулевой длины, а не null

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

Есть ли способ настроить Automapper для назначения адресата null, когда источник null?

Если мое объяснение неясно, следующий код иллюстрирует то, что я пытаюсь описать:

public class Test
{
    public byte[] ByteArray { get; set; }
    public int? NullableInt { get; set; }
    public int Int { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Mapper.CreateMap<Test, Test>();

        var test1 = new Test { Int = 123, NullableInt = null, ByteArray = null };
        var test2 = Mapper.Map<Test>(test1);

        // test1:  Int == 123, NullableInt == null, ByteArray == null
        // test2:  Int == 123, NullableInt == null, ByteArray == byte[0]  <-- expect this to be null
    }
}
4b9b3361

Ответ 1

Я обнаружил, что это уже было сообщено как issue, и был добавлен новый параметр конфигурации (см. commit). На данный момент эта опция отсутствует в релизе, доступном через NuGet, но мне удалось выяснить способ ее устранения до следующей версии:

Mapper.CreateMap<Test, Test>()
    .ForMember(t => t.ByteArray, opt => opt.ResolveUsing(t => t.ByteArray == null ? null : t.ByteArray));

Обновление:

Начиная с версии 2.1.265.0 вы можете использовать свойство AllowNullCollections:

Mapper.Configuration.AllowNullCollections = true;
Mapper.CreateMap<Test, Test>();

Ответ 2

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