繁体   English   中英

您可以在AutoMapper中将相同的值解析器应用于多个成员

[英]In AutoMapper can you apply the same value resolver to multiple members

我有一些映射代码如下

Mapper.CreateMap<CalculationQueryResult, CalculationViewModel>()
       .ForMember(poco => poco.NomineeFee, 
                   opt => opt.ResolveUsing<FormattedCurrencyInt>()
         .FromMember(m => m.NomineeFee))

       .ForMember(poco => poco.TotalContributions, 
                   opt => opt.ResolveUsing<FormattedCurrencyInt>()
         .FromMember(m => m.TotalContributions))

       .ForMember(poco => poco.EquityInjection, 
                   opt => opt.ResolveUsing<FormattedCurrencyInt>()
         .FromMember(m => m.EquityInjection))

  // ... SNIP Lots more members mapped with Formatted Currency Resolver

如您所见,我正在使用相同的解析程序映射多个成员,以将整数转换为格式化的货币字符串。 我正在为绝大多数(但不是我的poco班上的所有成员)这样做。

如果我不需要重复这些类型,那么所有这些成员都将使用基于约定的映射进行映射。 为一个简单的任务编写大量的代码。

有什么方法可以覆盖默认行为,即将int转换为单个映射的字符串,然后在需要其他方法的地方执行自定义.ForMembers。 如:

Mapper.CreateMap<CalculationQueryResult, CalculationViewModel>()
            .SetDefault<int,string>(opt => opt.ResolveUsing<FormattedCurrencyInt>())
            .ForMember(poco => poco.Count, x=>x.MapFrom(s => s.Count.ToString()));

您可以创建默认映射为

Mapper.CreateMap<int, string>().ConvertUsing<FormattedCurrencyIntConverter>();

private class FormattedCurrencyIntConverter : TypeConverter<int, string> {
    protected override string ConvertCore(int numericValue) {
        return numericValue.ToString("C2");  // format here ...
    }
}

但是请注意,此映射规则将应用于所有整数! 对于某些成员可能会覆盖此规则,但是我没有对其进行测试。

PS:我建议明确写下所有映射规则,并且不要依赖基于约定的映射。 如果仅在一侧重命名属性,则基于约定的映射会中断,但是IDE可以自动重构显式规则。

您不能以相同的方式将相同的值解析器应用于多个成员。

正如Georg Patscheider所建议的,它可以覆盖所有映射的从int到string的默认映射,但这可能带来比原始问题更严重的副作用。

您将不得不逐行写出映射。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM