【问题标题】:AutoMapper cannot convert enum to nullable int?AutoMapper 无法将枚举转换为可为空的 int?
【发布时间】:2012-03-15 14:10:34
【问题描述】:

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

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

【问题讨论】:

标签: automapper


【解决方案1】:

看起来没有,它不会自动为您处理这个问题。有趣的是,它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, 版本=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));

【讨论】:

    【解决方案2】:

    以防万一有人想尝试使用类型转换器

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

    干杯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      相关资源
      最近更新 更多