调用不存在的属性会抛出 runtimebinderexception。具体做法是,在编译期将类型标记为 dynamic 后,编译器会放弃静态检查,把成员访问操作推迟到运行时由 dlr(动态语言运行时)处理。dlr 会在运行时刻尝试解析该属性,如果找不到匹配项,就会抛出异常。这意味着代码可以顺利通过编译,但在执行到该行时会中断。

dynamic 变量在编译和运行时的行为差异是什么
编译时,dynamic 变量被视为 object 类型,编译器不会对其成员访问进行任何验证。运行时,DLR 接管了绑定过程,它会根据变量的实际运行时类型来查找成员。这种机制允许编写更灵活的代码,但也带来了运行时错误的风险。

using System;
using System.Dynamic;
class Program
{
static void Main()
{
dynamic obj = new { Name = "Alice" };
try
{
// 调用不存在的属性
string result = obj.Age;
Console.WriteLine(result);
}
catch (RuntimeBinderException ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
预期结果:程序输出 Error: 'AnonymousType#1' does not contain a definition for 'Age'。
如何捕获并处理 RuntimeBinderException
可以通过 try-catch 块捕获 RuntimeBinderException 来处理这种情况。在捕获到异常后,可以根据需要进行日志记录、默认值返回或用户提示等操作。这样可以避免程序因未处理的异常而崩溃。

using System;
using System.Dynamic;
class Program
{
static void Main()
{
dynamic obj = new { Name = "Bob" };
try
{
string result = obj.Age;
Console.WriteLine(result);
}
catch (RuntimeBinderException ex)
{
Console.WriteLine($"Handled Error: {ex.Message}");
}
}
}
预期结果:程序输出 Handled Error: 'AnonymousType#1' does not contain a definition for 'Age'。
当 dynamic 对象来自外部 API 时,如何处理缺失属性
当 dynamic 对象来自外部 API(如 JSON 解析)时,缺失属性同样会引发 RuntimeBinderException。为了稳健处理,建议在访问属性前先检查其存在性,或者使用默认值。例如,可以使用 TryGetMember 方法或反射来检查属性是否存在,从而避免异常。










