在 ASP.NET Core Controller 方法中,它有一个 dynamic
类型的参数,我想使用 Automapper 进行映射,如下所示。该方法如下所示:
public IActionRsult Post([FromBody] dynamic model) {
// Skip validation
switch(model.src) {
case "employer"
var employerVM = _mapper.Map<EmployerViewModel>(model.data);
// Work with mapped object
break;
case "employee"
var employeeVM = _mapper.Map<EmployeeViewModel>(model.data);
// Work with mapped object
break;
}
}
哪里EmployerViewModel
看起来像这样:
public class EmployerViewModel {
public string CompanyName {get; set;}
public string CompanyAddress {get; set;}
}
和EmployeeViewModel
看起来像这样:
public class EmployeeViewModel {
public string FirstName {get; set;}
public string LastName {get; set;}
public bool Ready {get; set;}
}
它从客户端接收 JSON 数据,可能如下所示:
{
"src": "employer",
"data": {
"CompanyName": "Pioneers Ltd.",
"CompanyAddress": "126 Schumacher St., London"
}
}
或者这个:
{
"src": "employee",
"data": {
"FirstName": "John",
"LastName": "Doe",
"Ready": true
}
}
现在一切正常,除了 bool 属性,无论 JSON 中的值是什么, bool 属性总是设置为 false。我有 JSON 输入格式化程序,它在参数中构造实例。我检查了实例的类型,发现它们是 Newtonsoft.Json.Linq.JObject
知道如何让 bool 值正确运行吗?
我想继续支持使用 TDestination IMapper.Map<TDestination>(object source)
映射任意数量的目标类(参见 here )而不必为每个映射显式构造 AutoMapper 映射。有什么提示可以实现吗?
附言我正在使用 AutoMapper 6.2.1 和 ASP.NET Core 1.1.3
最佳答案
问题是 JObject
将其内容包装在 JValue
中,因此默认情况下它不能与 AM 一起工作,AM 当然需要实际值。所以你必须让 AM 知道如何映射一个 JValue
:
cfg.CreateMap<JValue, object>().ConvertUsing(source => source.Value);
关于c# - 使用 Automapper 从动态/JObject 映射到任意类型而不创建多个映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47473087/