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