C# 使用自动映射覆盖现有映射
我有以下实体和视图模型:C# 使用自动映射覆盖现有映射,c#,linq,enums,automapper,C#,Linq,Enums,Automapper,我有以下实体和视图模型: public class Report { public int? Day { get; set; } public int? Week { get; set; } public int? Month { get; set; } public int Year { get; set; } } public class ReportViewModel { public int Value { get; set; }
public class Report
{
public int? Day { get; set; }
public int? Week { get; set; }
public int? Month { get; set; }
public int Year { get; set; }
}
public class ReportViewModel
{
public int Value { get; set; }
public int Year { get; set; }
}
为了映射这一点,我目前使用以下方法
Mapper.Initialize(c =>
{
c.CreateMap<Report, ReportViewModel>();
}
如何根据传递的枚举将Value属性的映射设置为动态的
在执行以下查询之前,我尝试覆盖配置,但这不起作用
Mapper.CreateMap<Report, ReportViewModel>()
.ForMember(src => src.Value, dest => dest.MapFrom(r => (reportingPeriod == ReportingPeriod.Monthly) ?
r.Month.Value : reportingPeriod == ReportingPeriod.Weekly ?
r.Week.Value : r.Day.Value));
Mapper.CreateMap()
.FormMember(src=>src.Value,dest=>dest.MapFrom(r=>(reportingPeriod==reportingPeriod.Monthly)?
r、 Month.Value:reportingPeriod==reportingPeriod.Weekly?
r、 周值:r.Day.Value);
您需要返回值。IMO switch语句比嵌套语句更清晰,否则:
Mapper.CreateMap<Report, ReportViewModel>()
.ForMember(src => src.Value,
dest => dest.MapFrom(r =>
switch(reportingPeriod)
{
case ReportingPeriod.Daily:
return r.Day.Value;
break;
case ReportingPeriod.Weekly:
return r.Week.Value;
break;
case ReportingPeriod.Monthly:
return r.Month.Value;
break;
case default:
//None
return null;
break;
}));
Mapper.CreateMap()
.ForMember(src=>src.Value,
dest=>dest.MapFrom(r=>
开关(报告期)
{
病例报告期。每日:
返回r.Day.Value;
打破
病例报告期。每周:
返回r.Week.Value;
打破
病例报告期。每月:
返回r.Month.Value;
打破
案例默认值:
//没有
返回null;
打破
}));
使用Automapper 5.2.0版,您的语法应如下所示。您应该使用ResolveUsing而不是MapFrom,并且swith case应该位于花括号内。您不必使用任何Mapper.Initialize()。我测试了这段代码,它适合我。我希望这对你也有帮助。干杯
有人问了类似的问题。见局长的答案
var config = new MapperConfiguration(cfg =>
{
Mapper.CreateMap<Report, ReportViewModel>()
.ForMember(src => src.Value,
dest => dest.ResolveUsing(r => {
switch(reportingPeriod)
{
case ReportingPeriod.Daily:
return r.Day.Value;
break;
case ReportingPeriod.Weekly:
return r.Week.Value;
break;
case ReportingPeriod.Monthly:
return r.Month.Value;
break;
case default:
//None
return null;
break;
}
}));
});
var mapper = config.CreateMapper();
var config=new-MapperConfiguration(cfg=>
{
Mapper.CreateMap()
.ForMember(src=>src.Value,
dest=>dest.resolvusing(r=>{
开关(报告期)
{
病例报告期。每日:
返回r.Day.Value;
打破
病例报告期。每周:
返回r.Week.Value;
打破
病例报告期。每月:
返回r.Month.Value;
打破
案例默认值:
//没有
返回null;
打破
}
}));
});
var mapper=config.CreateMapper();
只需将所有值+枚举值复制到视图模型,并让其具有选择正确值的显示属性。我同意改用switch语句。这当然更好,但是,当我这样做时,它没有覆盖在Mapper.Initialize()方法中创建的现有映射。您现有的映射实现是什么?Mapper.Initialize(c=>{c.CreateMap();})以及我的所有其他映射,是在Web API的my Global.asax.cs文件中调用的静态方法中。您在哪里为NegativeReport和NegativeReportModel调用CreateMap?很抱歉造成混淆,应该是Report&ReportViewModel。我对问题进行了修改。
Mapper.CreateMap<Report, ReportViewModel>()
.ForMember(src => src.Value,
dest => dest.MapFrom(r =>
switch(reportingPeriod)
{
case ReportingPeriod.Daily:
return r.Day.Value;
break;
case ReportingPeriod.Weekly:
return r.Week.Value;
break;
case ReportingPeriod.Monthly:
return r.Month.Value;
break;
case default:
//None
return null;
break;
}));
var config = new MapperConfiguration(cfg =>
{
Mapper.CreateMap<Report, ReportViewModel>()
.ForMember(src => src.Value,
dest => dest.ResolveUsing(r => {
switch(reportingPeriod)
{
case ReportingPeriod.Daily:
return r.Day.Value;
break;
case ReportingPeriod.Weekly:
return r.Week.Value;
break;
case ReportingPeriod.Monthly:
return r.Month.Value;
break;
case default:
//None
return null;
break;
}
}));
});
var mapper = config.CreateMapper();