为什么动态在第一种情况下有效,而在第二种情况下无效



通过

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"的定义">

您需要扩展您的答案,以包含一个完整且可复制的示例。您所描述的内容按预期工作,不会出现错误,因此两者之间一定存在导致问题的内容,例如自定义克隆或序列化,这些内容正在更改ObjectResult的Value后面的可识别类型。

[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属性的类的内容都会生成反映底层类型的消息。

最新更新