我得到了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的定义更改为枚举。我必须处理这样的接口。
答案 0 :(得分:17)
看起来不行,它不会自动为您处理。有趣的是,将将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,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;
}
}
干杯