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

时间:2015-11-27 12:08:01

标签: c# automapper

我有一些映射代码如下

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

正如您所看到的,我使用相同的解析器映射多个成员,以将整数转换为格式化的货币字符串。我为绝大多数人做了这件事,但并不是我所拥有的所有成员。

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

是否有任何方法可以覆盖将int转换为单个地图的字符串的默认行为,然后执行自定义.ForMembers,我想要不同的东西。比如这个:

var bodyParser = require('body-parser');
var app = express();
port = parseInt(process.env.PORT, 10) || 8080;

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true }));

// parse application/json
app.use(bodyParser.json());

app.listen(port);

app.post("/someRoute", function(req, res) {
  console.log(req.body);
  res.status(200).json({ status: 'SUCCESS' });
});

2 个答案:

答案 0 :(得分:4)

您可以将默认映射创建为

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可以自动重构显式规则。

答案 1 :(得分:0)

您无法以所描述的方式将相同的值解析器应用于多个成员。

它可以覆盖所有映射的从int到string的默认映射,如Georg Patscheider所建议的那样,但这可能会比原始问题更糟糕。

您必须逐行写出映射。

相关问题