将public object Parameters { get; set; }
投射到预期的对象结构request.Parameters as ParametersForA
中会返回null。
我尝试使用request.Parameters
序列化ParametersForA
并将其反序列化为Newtonsoft.Json
类型,这很完美,但是我仍然不满意我,因为我想了解以前的失败。
这是我测试的代码:
C#
using Microsoft.AspNetCore.Mvc;
namespace ObjectCasting.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
[HttpPost]
public IActionResult Post([FromBody]Request request)
{
if (request.OperationCode == "A")
{
var obj = request.Parameters as ParametersForA; // <<< null problem
return Ok(obj);
}
return BadRequest();
}
}
public class Request
{
public string OperationCode { get; set; }
public object Parameters { get; set; }
}
public class ParametersForA
{
public int Age { get; set; }
public string Name { get; set; }
}
}
这是HTTP POST json请求正文:
json
{
"OperationCode": "A",
"Parameters": {
"Age": 25,
"Name": "Caroline"
}
}
我想了解为什么投射在这里不起作用。
对于将来指定的唯一OperationCode
,我将期望分别使用不同的转换目的地和Parameters
json请求结构。
答案 0 :(得分:3)
问题出在2
属性的类型中。收到请求后,它是3
,实际类型是public interface Barista {
@Output
MessageChannel orders();
}
。
您应该使用Parameters
方法进行强制转换,将object
强制转换为所需的类型:
JObject
要根据ToObject<SomeType>()
强制转换为其他类型:
JObject
答案 1 :(得分:1)
铸造遵循某些规则,对于引用类型,应该具有层次结构,以便能够将一种类型转换为另一种类型。
在您的情况下,您无法投射它,因为您的Parameter
实际上是JToken
,不能直接投射到ParameterA
。
隐式转换:不需要特殊语法,因为 转换是类型安全的,不会丢失任何数据。例子包括 从较小的整数类型到较大的整数类型的转换,以及转换 从派生类到基类。