2012-03-15 2 views
7

я получил AutoMapperMappingException за исключениемAutoMapper не может преобразовать enum в nullable int?

Исключение из 'AutoMapper.AutoMapperMappingException' типа был брошен. ---> System.InvalidCastException: Invalid литой из '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 карты это неявно без какого-либо дополнительного явного правила?

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

+1

Вы не могли бы подать вопрос для этого? https://github.com/AutoMapper/AutoMapper/issues/new - спасибо! –

+0

Здесь https://github.com/AutoMapper/AutoMapper/issues/191 –

+0

Это была проблема, и она уже исправлена. –

ответ

15

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

Глядя на источник AutoMapper, я думаю, что problematic line является:

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?That question has already been asked here ,

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

Mapper.CreateMap<DummySource, DummyDestination>() 
    .ForMember(dest => dest.Dummy, opt => opt.MapFrom(src => (int?)src.Dummy)); 
-1

Только в том случае, если кто-то хочет попробовать использовать преобразователь типов

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; 
     } 
    } 

Приветствия

Смежные вопросы