AutoMapper无法将枚举转换为可空的int?

时间:2012-03-15 14:10:35

标签: automapper

我得到了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不应该在没有任何额外显式规则的情况下隐式映射这个吗?

P.S。我无法将DummyDestination.Dummy的定义更改为枚举。我必须处理这样的接口。

2 个答案:

答案 0 :(得分:17)

看起来不行,它不会自动为您处理。有趣的是,enum映射到常规int

看看AutoMapper的来源,我认为problematic line是:

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

假设context.SourceValue = DummyTypes.Foocontext.DestinationTypeint?,您最终会得到:

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

引发了类似的异常:

  

从“UserQuery + DummyTypes”转换为无效   'System.Nullable`1 [[System.Int32,mscorlib,Version = 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 :(得分:-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;
        }
    }

干杯