将可空字节映射到枚举时出现C#自动映射异常

将可空字节映射到枚举时出现C#自动映射异常,c#,.net,exception,enums,automapper,C#,.net,Exception,Enums,Automapper,我使用AutoMapper()自动将一个对象映射到另一个对象 源对象: public partial class SrcObject { public int Id { get; set; } ... public Nullable<byte> QcRea { get; set; } public Nullable<byte> QcPyg { get; set; } ... } 枚举: 制图员: Mapper.Create

我使用AutoMapper()自动将一个对象映射到另一个对象

源对象:

public partial class SrcObject
{
    public int Id { get; set; }

    ...

    public Nullable<byte> QcRea { get; set; }
    public Nullable<byte> QcPyg { get; set; }

    ...

}
枚举:

制图员:

Mapper.CreateMap<DateTime, Nullable<DateTime>>().ConstructUsing(MessageDtoConverter.ToNullable);
Mapper.CreateMap<float, Nullable<float>>().ConstructUsing(MessageDtoConverter.ToNullable);
Mapper.CreateMap<short, Nullable<short>>().ConstructUsing(MessageDtoConverter.ToNullable);
Mapper.CreateMap<QualityControlState, Nullable<byte>>().ConstructUsing(MessageDtoConverter.ToNullable);
Mapper.CreateMap<Nullable<byte>, QualityControlState>().ConstructUsing(MessageDtoConverter.ToQualityControlState);
Mapper.CreateMap<byte, Nullable<byte>>().ConstructUsing(MessageDtoConverter.ToNullable);
Mapper.CreateMap<bool, Nullable<bool>>().ConstructUsing(MessageDtoConverter.ToNullable);
Mapper.CreateMap<int, Nullable<int>>().ConstructUsing(MessageDtoConverter.ToNullable);

Mapper.CreateMap<SrcObject, DstObject>()
    .ForMember(d => d.RawResults, s => s.Ignore())
    .ForMember(d => d.CorrectedImage, s => s.Ignore())
    .ForMember(d => d.SegmentedImage, s => s.Ignore())
    .ForMember(d => d.QcReaRotationAngleVertical, s => s.Ignore())
    .ForMember(d => d.ReatoHCW, s => s.Ignore());

Mapper.AssertConfigurationIsValid();
似乎没有调用“Nullable to enum”的自定义映射器

AssertConfigurationsValid()没有问题

但是为什么呢?我如何转换这个


有什么想法吗?谢谢

尝试使用
类型转换器
。像这样的方法应该会奏效:

public class QualityControlStateTypeConverter
                           : TypeConverter<Nullable<byte>, QualityControlState>
{
    protected override QualityControlState ConvertCore(Nullable<byte> source)
    {
        return (source != null)
            ? (QualityControlState)Enum.Parse(typeof(QualityControlState),
                                              source.ToString())
            : QualityControlState.Ok;
    }
}
公共类QualityControlStateTypeConverter
:类型转换器
{
受保护的覆盖QualityControlState ConvertCore(可为空的源)
{
返回(源!=null)
?(QualityControlState)枚举解析(typeof(QualityControlState),
source.ToString())
:QualityControlState.Ok;
}
}
在映射配置中使用它,如下所示:

Mapper.CreateMap<Nullable<byte>, QualityControlState>()
      .ConvertUsing(new QualityControlStateTypeConverter());
Mapper.CreateMap()
.ConvertUsing(新的QualityControlStateTypeConverter());
我用这段代码测试了它,它似乎工作得很好:

var qcs = Mapper.Map<Nullable<byte>, QualityControlState>(null); // OK
qcs = Mapper.Map<Nullable<byte>, QualityControlState>(0);        // OK
qcs = Mapper.Map<Nullable<byte>, QualityControlState>(1);        // Warning
qcs = Mapper.Map<Nullable<byte>, QualityControlState>(2);        // Error
qcs = Mapper.Map<Nullable<byte>, QualityControlState>(3);        // 3
var qcs=Mapper.Map(null);//好啊
qcs=Mapper.Map(0);//好啊
qcs=Mapper.Map(1);//警告
qcs=Mapper.Map(2);//错误
qcs=Mapper.Map(3);//3.
_innerException = 
{"Object reference not set to an instance of an object."}

base {System.Exception} =
{"\r\n\r\nMapping types:\r\nNullable`1 -> QualityControlState\r\nSystem.Nullable`1[[System.Byte, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] -> QualityControlState\r\n\r\nDestination path:\r...

MemberName = "QcRea"

SourceType =
{Name = "Nullable`1" FullName = "System.Nullable`1[[System.Byte, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}

DestinationType =
{Name = "QualityControlState" FullName = "QualityControlState"}
public class QualityControlStateTypeConverter
                           : TypeConverter<Nullable<byte>, QualityControlState>
{
    protected override QualityControlState ConvertCore(Nullable<byte> source)
    {
        return (source != null)
            ? (QualityControlState)Enum.Parse(typeof(QualityControlState),
                                              source.ToString())
            : QualityControlState.Ok;
    }
}
Mapper.CreateMap<Nullable<byte>, QualityControlState>()
      .ConvertUsing(new QualityControlStateTypeConverter());
var qcs = Mapper.Map<Nullable<byte>, QualityControlState>(null); // OK
qcs = Mapper.Map<Nullable<byte>, QualityControlState>(0);        // OK
qcs = Mapper.Map<Nullable<byte>, QualityControlState>(1);        // Warning
qcs = Mapper.Map<Nullable<byte>, QualityControlState>(2);        // Error
qcs = Mapper.Map<Nullable<byte>, QualityControlState>(3);        // 3