首页 > 解决方案 > C# 动态在访问属性时抛出 RuntimeBinderException

问题描述

RuntimeBinderException在尝试从动态对象中读取属性时遇到了问题。毫无疑问,这是我语法不太正确的问题之一,但我只是没有看到它......

使用一个简单的 LinqPad 脚本,以下工作正常:

void Main()
{
    var response = new
    {
        DotNet = Environment.Version,
        ServerName = Environment.MachineName,
    };
    
    dynamic d = response;   
    var x = d.DotNet as Version;
    x.Major.Dump();
}

如果我从 Web 方法返回它,那么我就会遇到问题。这是我的简单网络方法(.Net 5 WebAPI)

public IActionResult GetEnvironmentDetails()
{
    var response = new
    {
        DotNet = Environment.Version,
        ServerName = Environment.MachineName,
    };
    return this.Ok(response);
}

在我的单元测试中,我可以使用反射读取属性,但不能使用动态:

var c = new MyController();
var response = c.GetEnvironmentDetails() as OkObjectResult;

// This next line gets me the property using reflection:
Version dotNet = response.Value.GetType().GetProperty("DotNet").GetValue(response.Value, null) as Version;

// But...using dynamics
dynamic d = response.Value;

// then the following fails for me
object x = d.DotNet;

如果我将变量d放在我的 WATCH 窗口中,则 Value 显示为{ DotNet = {5.0.4}, ServerName = "MyComputerName" },Type 为<Anonymous Type>

标签: c#dynamic

解决方案


推荐阅读