Состояние Automapper игнорируется - PullRequest
5 голосов
/ 04 ноября 2011

Проблема Похоже, что условие игнорируется.Вот мой сценарий:

Исходный класс

public class Source
{
    public IEnumerable<Enum1> Prop1{ get; set; }

    public IEnumerable<Enum2> Prop2{ get; set; }

    public IEnumerable<Enum3> Prop3{ get; set; }
}

Подкласс enums из байта и украшен [Flags].Целевой класс просто содержит свойства, такие как Enum1, Enum2 и Enum3, которые связаны с «побочным» побитовым значением.Таким образом, в сущности, если перечисление содержит Enum1.value !, Enum1.Value2 и Enum1.Value3, место назначения будет содержать побитовое значение Enum1.Value1 |Enum1.Value2 |Enum1.Value3

Класс назначения

    public Enum1 Prop1 { get; set; }

    public Enum2 Prop2 { get; set; }

    public Enum3 Prop3 { get; set; }

Отображение AutoMapper

    Mapper.CreateMap<Source, Destination>()
            .ForMember(m => m.Prop1, o =>
                {
                    o.Condition(c => !c.IsSourceValueNull);
                    o.MapFrom(f => f.Prop1.Aggregate((current, next) => current | next));
                })
            .ForMember(m => m.Prop2, o =>
            {
                o.Condition(c => !c.IsSourceValueNull);
                o.MapFrom(f => f.Prop2.Aggregate((current, next) => current | next));
            })
            .ForMember(m => m.Prop3, o =>
            {
                o.Condition(c => !c.IsSourceValueNull);
                o.MapFrom(f => f.Prop3.Aggregate((current, next) => current | next));
            });  

Отображение работает нормально, когда внутреннийсвойства не равны NULL, и сопоставление успешно выполняется и правильно устанавливает пункт назначения.Тем не менее, я хочу пропустить сопоставление, когда значение источника элемента равно нулю (когда Prop1 равно нулю, тогда пропустить сопоставление).

Из отладки видно, что Source.Prop1 имеет значение null.Условие полностью игнорируется и получается исключение, говорящее, что значение равно нулю.

Trying to map Source to Destination. Destination property: Prop1. Exception of type 'AutoMapper.AutoMapperMappingException' was thrown. --> Value cannot be null. Parameter name: source

Я не уверен, проверяет ли IsSourceValueNull проверку Prop1 или фактический класс Source, который не является нулевым.Только член Prop1 является нулевым.

Любая помощь приветствуется.

Ответы [ 2 ]

7 голосов
/ 04 ноября 2011

Я думаю, вам нужно сделать Condition и MapFrom в два этапа:

.ForMember(c => c.Prop1, o => o.Condition(c => !c.IsSourceValueNull));
.ForMember(c => c.Prop1, o => o.MapFrom(f => f.Prop1.Aggregate(...));

MapFrom никогда не будет использоваться, если Условие оценивается как ложное.

EDIT

Хммм ... Кажется, это не работает. Я думал, что использовал это раньше где-то. Вы можете прибегнуть только к MapFrom:

.MapFrom(f => f.Prop1 == null ? null : f.Prop1.Aggregate(...));
2 голосов
/ 05 ноября 2011

IMO, на самом деле это ошибка в AutoMapper EnumMapper . Операторы условия, как они указаны выше, должны работать нормально. Например, при отображении из одного конкретного типа в другой TypeMapMapper правильно вызовет условное выражение:

object mappedObject = !context.TypeMap.ShouldAssignValue(context) ? null : mapperToUse.Map(context, mapper);

Что в конечном итоге вызывает определенное условие :

    public bool ShouldAssignValue(ResolutionContext context)
    {
        return _condition == null || _condition(context);
    }

Но EnumMapper не вызывает метод ShouldAssignValue TypeMap, чтобы выяснить, действительно ли оно должно отображать это поле. Точно так же я не вижу никакой ссылки на AfterMap, поэтому вряд ли что-то определенное там не сработает.

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