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

标签 c# wcf automapper

假设这个枚举合约:

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

另一侧有 0 到 2 三个成员,我有另一个枚举,其中有 7 个成员:

 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

这在客户端很明显,我们最终会遇到如下异常:

Enum value '3' is invalid for type 'xxx.ReportType_DTO' and cannot be serialized. Ensure that the necessary enum values are present and are marked with EnumMemberAttribute attribute if the type has DataContractAttribute attribute.

还有其他方法可以强制 Automapper 显式更改值吗?

更新1:

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

更新2:

是的struct就是原因,通过将结构更改为类,它可以很好地工作,但我返回 DTO_OUT作为结构出于某种原因强制操作不返回 null,所以我无法将它们更改为类,我相信必须有一个解决方案来通过引用告诉 autommaper 调用,我认为 AfterMape是一个 void 方法,它通过引用机制更改调用中输入的参数。

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

最佳答案

没有办法让 AutoMapper 通过引用 AfterMap 操作来传递 struct。因此,您需要一种不同的方法,而不是基于 AfterMap

一种方法是创建从 RptTypeReportType_DTO 的映射,将开关逻辑包装在 ConvertUsing 中。然后使用典型的 ForMember 设置创建从 Report_CReport_DTO 的映射:

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();

关于c# - Automapper 在类和结构 AfterMap 之间不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43635074/

相关文章:

c# - AutoMapper 投影中的 Lambda 表达式错误

在 BeforeMap/AfterMap 中使用 Map 方法进行 AutoMapper(非静态)配置

c# - 如何在 visual studio 中调试 nuget 包

c# - 方法 this.hide() 与 this.close()

c# - 使用 Visual Studio 创建 T-SQL 表单

c# - 服务器 500 : Too many pending secure conversations

c# - 初始化列表属性的最佳实践?

c# - WCF: "Error creating reader for MTOM message"

c# - EndpointDispatcher 的 ContractFilter 不匹配(错误处理)

c# - 使用 AutoMapper 映射后,上下文未更新加载的实体