使用'as'将对象强制转换为预期类型将返回null

时间:2019-04-17 07:46:08

标签: c# casting asp.net-core-webapi

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请求结构。

request

2 个答案:

答案 0 :(得分:3)

问题出在2属性的类型中。收到请求后,它是3,实际类型是public interface Barista { @Output MessageChannel orders(); }

您应该使用Parameters方法进行强制转换,将object强制转换为所需的类型:

JObject

要根据ToObject<SomeType>()强制转换为其他类型:

JObject

答案 1 :(得分:1)

铸造遵循某些规则,对于引用类型,应该具有层次结构,以便能够将一种类型转换为另一种类型。

在您的情况下,您无法投射它,因为您的Parameter实际上是JToken,不能直接投射到ParameterA

根据documentation

  

隐式转换:不需要特殊语法,因为   转换是类型安全的,不会丢失任何数据。例子包括   从较小的整数类型到较大的整数类型的转换,以及转换   从派生类到基类。