假设这个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并没有获得新值,如下图所示:
这在客户端很明显,我们最终会遇到例外情况:
枚举值&#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方法,它通过引用机制改变了调用中的参数。
任何想法和帮助将不胜感激。
答案 0 :(得分:2)
无法通过引用struct
操作让AutoMapper通过AfterMap
。所以你需要一种不同的方法,而不是基于AfterMap
。
一种方法是在RptType
中创建从ReportType_DTO
到ConvertUsing
包裹切换逻辑的映射。然后使用典型的Report_C
设置创建从Report_DTO
到ForMember
的映射:
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();