WebApi控制器中用AutoMapper将Dynamic类型转为Person实体类
我来给你几个靠谱的解决方案,帮你把WebApi控制器里的dynamic类型person转换成自定义的Person实体类:
方法1:用Json.NET直接转换(最稳妥的原生方案)
因为WebApi默认使用Json.NET处理序列化,你可以把dynamic先转成JObject,再反序列化成Person实体,代码示例:
using Newtonsoft.Json; using Newtonsoft.Json.Linq; [HttpPost] public IHttpActionResult Post([FromBody]dynamic person) { // 将dynamic转换为JObject JObject personObj = JObject.FromObject(person); // 反序列化为Person实体 Person personEntity = personObj.ToObject<Person>(); // 现在personEntity就是你需要的实体了,可以正常使用它的属性 return Ok(personEntity); }
方法2:修复AutoMapper的配置(如果坚持用AutoMapper)
你之前用Mapper.Initialize没成功,大概率是映射配置没匹配对——因为WebApi里的dynamic实际运行时类型是JObject,不是你发起请求时的匿名类型。调整配置即可:
旧版AutoMapper(8.x及以下)
// 在项目启动处配置(比如Global.asax的Application_Start方法里) Mapper.Initialize(cfg => { // 配置JObject到Person的映射,或者直接配置dynamic到Person cfg.CreateMap<JObject, Person>(); // 或者 cfg.CreateMap<dynamic, Person>(); }); // 控制器中使用 [HttpPost] public IHttpActionResult Post([FromBody]dynamic person) { Person personEntity = Mapper.Map<Person>(person); return Ok(personEntity); }
新版AutoMapper(9.x及以上)
新版推荐使用MapperConfiguration来创建映射器,避免静态Mapper的问题:
// 可以在Startup.cs或者专门的映射配置类中初始化 var mapperConfig = new MapperConfiguration(cfg => { cfg.CreateMap<JObject, Person>(); }); IMapper mapper = mapperConfig.CreateMapper(); // 控制器中使用 [HttpPost] public IHttpActionResult Post([FromBody]dynamic person) { Person personEntity = mapper.Map<Person>(person); return Ok(personEntity); }
方法3:手动映射(适合属性少的场景)
如果你的Person类属性不多,手动赋值是最直接的方式,完全不需要依赖第三方库:
[HttpPost] public IHttpActionResult Post([FromBody]dynamic person) { Person personEntity = new Person { Firstname = person.Firstname, Lastname = person.Lastname }; return Ok(personEntity); }
补充说明
为什么之前AutoMapper没生效?因为你发起请求时的匿名类型,到了WebApi控制器里会被序列化为JObject类型的dynamic,而不是原来的匿名类型。所以你如果之前配置的是匿名类型到Person的映射,自然会失效,改成JObject或dynamic到Person的映射就可以正常工作了。
内容的提问来源于stack exchange,提问作者TheBoubou
相关产品推荐
相关产品推荐

