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
}
}
Ответы
Ответ 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.