Предположим, у вас есть следующие классы:
public class Source
{
public string Data { get; set; }
}
public class Destination
{
public JObject Data { get; set; }
}
И вы настраиваете AutoMapper, используя это:
Mapper.Initialize(
cfg =>
{
cfg.CreateMap<Source, Destination>()
.ForMember(
d => d.Data,
c => c.MapFrom(s => JsonConvert.DeserializeObject(s.Data ?? "")
}
);
Когда вы сопоставляете объект Source
со значением для Data
, которое приводит к нулевому json (например, нулевое значение, пустая строка или строка «null», все из которых приводят к тому, что JsonConvert возвращает нуль), значение Destination.Data
заканчивается установить пустой JObject вместо null.
Есть ли способ вообще запретить Automapper инициализировать элемент назначения?
Есть несколько разных вещей, которые вы можете сделать, но большинство из них охватывают только часть случаев. Например, вы можете добавить условие к сопоставлению, которое будет применяться только тогда, когда Source.Data
не является нулевым или пустым. Но это не работает, если Source.Data
является строкой "null".
Есть ли лучший способ справиться с этим без необходимости добавлять кучу специальных условий корпуса снаружи?
Примечание: я могу заставить его работать, предоставив сопоставление верхнего уровня между строкой и JObject. Но это означало бы, что я должен использовать одну и ту же логику для каждого случая, и я хочу, чтобы она применялась ТОЛЬКО к этому одному свойству.
AllowNullCollections
похоже, он сделает то, на что я надеюсь. Я думаю, что я согласен с этим для каждого профиля, поскольку в этом случае я все еще могу настроить конверсию для каждого участника. Я хочу избежать опции преобразования, потому что данные, являющиеся пустым объектом, действительны и не должны быть обнулены. 30.11.2018