У меня есть стандартный класс типа "динамический словарь" в С# -
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
в журналы отладки. Хотя я знаю, что исключения из первого шанса не являются проблемой сами по себе, это вызывает некоторые проблемы для меня:
-
У меня часто есть отладчик, настроенный на "break on exceptions", поскольку я пишу приложения WPF, и в противном случае все исключения заканчиваются тем, что они преобразуются в
DispatcherUnhandledException
, и вся фактическая информация, которую вы хотите потерять, WPF отстой такой. -
Как только я нажимаю на любой код, использующий
dynamic
, журнал вывода отладки становится бесполезным. Все полезные строки трассировки, которые мне интересны, скрываются среди всех бесполезныхRuntimeBinderException
s
Можно ли отключить это, или RuntimeBinder
, к сожалению, только что построенный?
Спасибо, Орион