【问题标题】:How do I get dynamic properties from OkObjectResult如何从 OkObjectResult 获取动态属性
【发布时间】:2019-04-16 06:43:12
【问题描述】:

我从控制器方法返回 IActionResult 和匿名对象的值。
如何再次取出数据?

这是简化为问题的控制器方法:

[HttpPost]
public async Task<IActionResult> UploadFile(IFormFile file)
{
    long size = file.Length;
    return Ok(new { count = 1, size });
}

然后我得到.Value 属性,它是一个object 并使其成为dynamic
但是不,它不被识别。

[Fact]
public async Task UploadFileTest()
{
    //  #   Given.
    var formFile = new Mock<IFormFile>();
    var sut = new HomeController(null);

    //  #   When.
    IActionResult result = await sut.UploadFile(formFile.Object);

    //  #   Then.
    OkObjectResult okResult = (OkObjectResult)result; // Ok.
    dynamic dynValue = okResult.Value; // Ok.
    var count = dynValue.count; // Not ok.
}

预期结果:

count 应该是 1。

实际结果:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:“object”不包含“count”的定义

【问题讨论】:

  • 你试过这样 => dynamic dynValue = okResult.Value as dynamic; 吗? dynamic dynValue = okResult.Value as ExpandoObject; ?
  • @er-sho 尝试将dynValue 转换为dynamic 不会做任何事情,因为它已经被声明为dynamic。因此,当尝试转换为 ExpandoObject 时,所发生的一切就是 dynValue 变为空。 dynamicExpandoObject 不是一回事。加上尝试。

标签: c# anonymous-class


【解决方案1】:

尝试反射:

var count = (int)okResult.Value.GetType().GetProperty("count").GetValue(okResult.Value);

【讨论】:

    【解决方案2】:

    如果你的测试和原始代码不在同一个项目中,如果是这样,你需要在你的原始代码项目中创建AssemblyInfo.cs,使其(原始)共享动态对象结构。

    你可以在https://sodocumentation.net/csharp/topic/4264/assemblyinfo-cs-examples#-internalsvisibleto-看到更多

    它应该有如下代码(将字符串替换为您的测试名称)

    [assembly: InternalsVisibleTo("MyAssembly.UnitTests")]
    

    【讨论】:

      猜你喜欢
      • 2020-02-13
      • 1970-01-01
      • 2017-01-15
      • 2016-09-20
      • 2013-10-08
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      相关资源
      最近更新 更多