У меня есть стандартный класс типа 'динамический словарь' в 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
}
Приложение делает то, что от него ожидают, но выходные данные отладки выглядят так:
A first chance exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in Microsoft.CSharp.dll
A first chance exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in Microsoft.CSharp.dll
'ScratchConsoleApplication.vshost.exe' (Managed (v4.0.30319)): Loaded 'Anonymously Hosted DynamicMethods Assembly'
A first chance exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in Microsoft.CSharp.dll
A first chance exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in Microsoft.CSharp.dll
Любая попытка доступа к динамическому члену, похоже, выводит RuntimeBinderException
в журналы отладки. Хотя я знаю, что исключения первого шанса сами по себе не являются проблемой, это вызывает у меня некоторые проблемы:
У меня часто есть отладчик, настроенный на «прерывание по исключениям», так как я пишу приложения WPF, в противном случае все исключения в итоге преобразуются в DispatcherUnhandledException
, и вся необходимая информация теряется , WPF такой отстой.
Как только я нажимаю любой код, который использует dynamic
, журнал вывода отладки становится довольно бесполезным. Все полезные линии трассировки, о которых я забочусь, прячутся среди всех бесполезных RuntimeBinderException
s
Можно ли как-нибудь отключить это, или, к сожалению, RuntimeBinder
просто построен таким образом?
Спасибо, Орион