我在C#中有一个标准的“动态字典”类型类 -
class Bucket : DynamicObject
{
readonly Dictionary<string, object> m_dict = new Dictionary<string, object>();
public override bool TrySetMember(SetMemberBinder binder, object value)
{
m_dict[binder.Name] = value;
return true;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
return m_dict.TryGetValue(binder.Name, out result);
}
}
现在我这样调用:
static void Main(string[] args)
{
dynamic d = new Bucket();
d.Name = "Orion"; // 2 RuntimeBinderExceptions
Console.WriteLine(d.Name); // 2 RuntimeBinderExceptions
}
这个应用程序的功能和你期望的一样,但调试输出看起来像这样:
在 Microsoft.CSharp.dll 中发生了类型为“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”的第一次机会异常 在 Microsoft.CSharp.dll 中发生了类型为“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”的第一次机会异常 “ScratchConsoleApplication.vshost.exe”(已加载(v4.0.30319)):“匿名主机的 DynamicMethods Assembly” 已加载 在 Microsoft.CSharp.dll 中发生了类型为“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”的第一次机会异常 在 Microsoft.CSharp.dll 中发生了类型为“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”的第一次机会异常
任何尝试访问动态成员似乎都会将RuntimeBinderException
输出到调试日志中。我知道第一次机会异常本身并不是问题,但这对我造成了一些麻烦:
我经常将调试器设置为“断点异常”,因为我正在编写WPF应用程序,否则所有异常最终都会被转换为一个
DispatcherUnhandledException
,而你想要的所有实际信息都会丢失。WPF就是这样。一旦我打开任何使用
dynamic
的代码,调试输出日志就变得相当无用。我关心的所有有用的跟踪行都被所有无用的RuntimeBinderException
隐藏了。
有没有办法关闭这个功能,或者RuntimeBinder
不幸就是这样构建的呢?
谢谢,Orion
dynamic
关键字构建的内容时显示的正常行为...这似乎是微软C#团队的一个糟糕的设计决策,但这就是现实。 - Orion Edwards