假设这个枚举合约:
[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 似乎没有获得新值,如下图所示:
这在客户端很明显,我们最终会遇到如下异常:
block 引用>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
。
一种方法是创建从 RptType
到 ReportType_DTO
的映射,将开关逻辑包装在 ConvertUsing
中。然后使用典型的 ForMember
设置创建从 Report_C
到 Report_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/