Automapper在类和结构之间不起作用AfterMap

时间:2017-04-26 13:03:38

标签: c# wcf automapper

假设这个Enum合同:

  [DataContract]
public enum ReportType_DTO
{
    [EnumMember]
    Voice,
    [EnumMember]
    Text,
    [EnumMember]
    File
}

在另一边有3个成员从0到2我有另一个有7个成员的Enum:

 public enum RptType
{
    Word = 0,
    Dynamic = 1,
    Basic = 2,
    StructuredReport = 3,
    Word2007 = 4,
    PDF = 5,
    WebReport = 6,
    WebTemplate = 7
}

所以我将映射配置为:

  var mapper1 = new MapperConfiguration((cfg) =>
            cfg.CreateMap<Report_C, Report_DTO>().AfterMap((reportC, reportDTO) =>
            { 
                switch ((RptType)reportC.Type)
                {
                    case RptType.Dynamic:
                    case RptType.PDF:
                    case RptType.Word:
                    case RptType.Word2007:
                    case RptType.WebTemplate:
                        reportDTO.Type = ReportType_DTO.File;
                        break;
                    case RptType.StructuredReport:
                        reportDTO.Type = ReportType_DTO.Voice;
                        break;
                    case RptType.Basic:
                    case RptType.WebReport:
                        reportDTO.Type = ReportType_DTO.Text;
                        break;
                }
                reportDTO.ReportUID = reportC.SOPInstanceUID;
            }))
            .CreateMapper();

并逐个映射集合:

  var foundReports = pacsReports.Collection.Select(r => mapper1.Map<Report_DTO>(r)).ToList();

案例RptType.StructuredReport发生了一个集合成员但是当我检查集合时,似乎prop并没有获得新值,如下图所示: enter image description here

这在客户端很明显,我们最终会遇到例外情况:

  
    

枚举值&#39; 3&#39;对于&#39; xxx.ReportType_DTO&#39;类型无效并且无法序列化。确保存在必要的枚举值,并且如果类型具有DataContractAttribute属性,则使用EnumMemberAttribute属性标记。

  

是否有其他方法可以强制Automapper明确更改值?

UPDATE1:

Report_DTO是结构类型,但是Report_C是一个类,它可能是原因(类似于引用调用或映射中struct的值调用)?

UPDATE2:

struct是原因,通过将结构更改为类它运行良好,但我因为某种原因返回DTO_OUT作为结构强制操作不会返回null所以我可以&# 39; t将它们更改为类,我相信必须有一个解决方案来通过引用来告诉autommaper调用,我认为AfterMape是一个void方法,它通过引用机制改变了调用中的参数。

任何想法和帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

无法通过引用struct操作让AutoMapper通过AfterMap。所以你需要一种不同的方法,而不是基于AfterMap

一种方法是在RptType中创建从ReportType_DTOConvertUsing包裹切换逻辑的映射。然后使用典型的Report_C设置创建从Report_DTOForMember的映射:

var mapper1 = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<RptType, ReportType_DTO>().ConvertUsing(rptType =>
    {
        switch (rptType)
        {
            case RptType.StructuredReport:
                return ReportType_DTO.Voice;
            case RptType.Basic:
            case RptType.WebReport:
                return ReportType_DTO.Text;
            default:
                return ReportType_DTO.File;
        }
    });

    cfg.CreateMap<Report_C, Report_DTO>()
        .ForMember(reportDTO => reportDTO.Type, opt => opt.MapFrom(reportC => (RptType)reportC.Type))
        .ForMember(reportDTO => reportDTO.ReportUID, opt => opt.MapFrom(reportC => reportC.SOPInstanceUID));
})
.CreateMapper();