【问题标题】:Why does dynamic work in the first case but not in the second?为什么动态在第一种情况下有效,而在第二种情况下无效?
【发布时间】:2022-01-22 12:03:57
【问题描述】:

通过了

        var badRequestObjectResult = new BadRequestObjectResult(new { ErrorMessage = "Hi" });
        dynamic response = badRequestObjectResult.Value;
        Assert.Equal("Hi", response.ErrorMessage);

虽然失败了

        dynamic response2 = ((BadRequestObjectResult)result).Value;//result is an IActionResult
        Assert.Equal("Hi", response2.ErrorMessage);

“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:‘object’不包含‘ErrorMessage’的定义”

【问题讨论】:

  • 第二个例子中的“结果”来自哪里?
  • 在签名中返回 IActionResult 并在正文中返回 BadRequestObjectResult 构造该对象的方法,如传递的代码中所示: new BadRequestObjectResult(new { ErrorMessage = "Hi" });

标签: c# .net-core dynamic


【解决方案1】:

您需要扩展您的答案以包含一个完整且可重复的示例。您所描述的内容按预期工作,没有错误,因此其中一定存在导致问题的原因,例如自定义克隆或序列化正在改变 ObjectResult 值背后的可识别类型。

[Test]
public void TestDynamic()
{
    var response1 = new BadRequestObjectResult(new { Message = "Hi." });
    var response2 = buildResponse();

    dynamic value1 = response1.Value;
    dynamic value2 = ((BadRequestObjectResult)response2).Value;

    string message1 = value1.Message;
    string message2 = value2.Message;

    Assert.AreEqual(message1, message2);
}

private IActionResult buildResponse()
{
    return new BadRequestObjectResult(new { Message = "Hi." });
}

我可以重现错误的唯一方法是如果 buildResponse 返回:

return new BadRequestObjectResult(new object());

返回诸如匿名类型或缺少 Message 属性的其他类之类的任何内容都会产生反映基础类型的消息。

【讨论】:

  • 谢谢,以后会更深入地审查它。返回 IActionResult 的方法是 Azure 函数是否重要?
  • 可能,这实际上取决于填充该对象结果的代码。例如,如果我有一个 C# 代码使用匿名类型填充它并返回它,则调用通过 Object 参数将其解析为匿名类型。相反,如果它通过 JSON 对其进行序列化和反序列化,则检查会将其视为 JSON 对象,但仍会解析该 Message 属性。该错误表明发送者或可能的通信导致值作为对象实例发送,而不是通过对象访问的类型(包含消息)。
猜你喜欢
  • 2022-12-18
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 2017-08-09
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
相关资源
最近更新 更多