Automapper SetValue 基于 属性 名称

Automapper SetValue based on Property Name

正在尝试使用 AutoMapper 根据 属性 名称设置 属性 值...

DTO ...

/// <summary>
/// DTO for the Performance Overview Report
/// </summary>
public class PerformanceOverviewDto
{
    public OverviewDto Summary1  { get; set; }
    public OverviewDto Summary2 { get; set; }
}

/// <summary>
/// DTO for the WorkIn Overview 
/// </summary>
public class OverviewDto : MetricOverviewDto
{
    /// <summary>
    /// Total Hours for the Period
    /// </summary>
    public Decimal? TotalHours { get; set; }

    /// <summary>
    /// Average Hours per working day 
    /// </summary>
    public string AvgHoursPerWorkingDay { get; set; } 
}

单位是我的 ViewModel 中用于标记的额外 属性

public class MetricsOverviewModel
{
    public MetricSummaryModel Summary1 { get; set; }
    public MetricSummaryModel Summary2 { get; set; }
}

public class MetricSummaryModel
{
    public string MinForPeriod { get; set; }
    public string MaxForPeriod { get; set; }
    public string Units { get; set; }
    public decimal TotalHours { get; set; }
    public string AvgHoursPerWorkingDay { get; set; }
    public IEnumerable<MetricSeriesOverviewDto> AllValuesPerTimePeriod { get; set; }
}

对于"Summary2" ..我想覆盖单位的默认值..

public class WebAutoMapperProfile : Profile
{
    protected override void Configure()
    {
        CreateMap<OverviewDto, MetricSummaryModel>()
            .ForMember(prop => prop.Units, opt => opt.UseValue(Strings.HoursinShort));
        CreateMap<PerformanceOverviewDto, MetricsOverviewModel>()
            .ForMember(prop => prop.Summary1.Units, opt => opt.UseValue(Strings.PercentSymbol));
    }
}

我越来越... 表达式 'prop => prop.Summary1.Units' 必须解析为顶级成员,而不是任何子对象的属性。在子类型或 AfterMap 选项上使用自定义解析器。

提前致谢! 基思.

查看 DTO 的代码会很有帮助,但我猜您需要以下内容:

CreateMap<OverviewDto, MetricSummaryModel>()
    .ForMember(prop => prop.Units, opt => opt.UseValue(Strings.HoursinShort));
CreateMap<PerformanceOverviewDto, MetricsOverviewModel>()
    .AfterMap((src, dest) => dest.Summary1.Units = Strings.PercentSymbol);

基本上,如果您从 PerformanceOverviewDto 映射 --> MetricsOverviewModelthis,这将使用第一个 CreateMapOverviewDto 映射到 MetricSummary,但随后它使用 AfterMapStrings.PercentSymbol 覆盖 Strings.HoursinShort