AutoMapper не может преобразовать enum в nullable int? - PullRequest
9 голосов
/ 15 марта 2012

Я получил исключение AutoMapperMappingException

Исключение типа 'AutoMapper.AutoMapperMappingException' было сгенерировано.---> System.InvalidCastException: недопустимое приведение из 'DummyTypes' к 'System.Nullable`1 [[System.Int32, ...

, когда

public enum DummyTypes : int
{
    Foo = 1,
    Bar = 2
}

public class DummySource
{
    public DummyTypes Dummy { get; set; }
}

public class DummyDestination
{
    public int? Dummy { get; set; }
}

[TestMethod]
public void MapDummy()
{
    Mapper.CreateMap<DummySource, DummyDestination>();
    Mapper.AssertConfigurationIsValid();
    DummySource src = new DummySource()
    {
        Dummy = DummyTypes.Bar
    };
    Mapper.Map<DummySource, DummyDestination>(src);
}

Следуетне AutoMapper отображать это неявно без каких-либо дополнительных явных правил?

PS Я не могу изменить определение DummyDestination.Dummy на enum.Мне приходится иметь дело с такими интерфейсами.

Ответы [ 2 ]

17 голосов
/ 15 марта 2012

Похоже, нет, это не позаботится об этом автоматически для вас. Интересно, что будет отображать enum на обычный int.

Глядя на источник в AutoMapper, я думаю, что проблемная строка это:

Convert.ChangeType(context.SourceValue, context.DestinationType, null);

Предполагая, что context.SourceValue = DummyTypes.Foo и context.DestinationType равны int?, вы получите:

Convert.ChangeType(DummyTypes.Foo, typeof(int?), null)

, который выдает подобное исключение:

Неверное приведение типа 'UserQuery + DummyTypes' к 'System.Nullable`1 [[System.Int32, mscorlib, версия = 4.0.0.0

Поэтому я думаю, что на самом деле вопрос в том, почему мы не можем привести переменную типа enum к int? Этот вопрос уже задавался здесь .

Это похоже на ошибку в AutoMapper. В любом случае, обходной путь заключается в том, чтобы сопоставить свойство вручную:

Mapper.CreateMap<DummySource, DummyDestination>()
    .ForMember(dest => dest.Dummy, opt => opt.MapFrom(src => (int?)src.Dummy));
0 голосов
/ 02 сентября 2015

На всякий случай, если кто-то захочет попробовать использовать конвертер типов

Mapper.CreateMap<int?, DummyTypes.Foo?>().ConvertUsing(new FooTypeConverter());

public class FooTypeConverter: TypeConverter<int?, DummyTypes.Foo?>
    {
        protected override DummyTypes.Foo? ConvertCore(int? source)
        {
            return source.HasValue ? (DummyTypes.Foo?)source.Value : null;
        }
    }

Приветствия

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