Я пытаюсь подписаться на ALL события, предоставляемые сторонним компонентом, похожим на GridView WPF, для выполнения некоторой отладки.Помимо предположения, что это не лучший способ отладки и тому подобное, я хотел бы знать, можно ли это сделать.
Для перенаправленных событий все работало нормально так:
var type = tree.GetType();
do
{
var staticFields = type.GetFields(BindingFlags.Static | BindingFlags.Public);
foreach (var staticField in staticFields)
{
if (typeof(RoutedEvent).IsAssignableFrom(staticField.FieldType))
{
tree.AddHandler((RoutedEvent)staticField.GetValue(null), new RoutedEventHandler(OnRoutedEvent), true);
}
}
} while ((type = type.BaseType) != typeof(object)/* && type.FullName.StartsWith("Telerik")*/);
public void OnRoutedEvent(object sender, System.Windows.RoutedEventArgs e)
{
Debug.WriteLine(e.RoutedEvent.ToString());
}
Однако, с типичными событиями это не работает:
var evts = tree.GetType().GetEvents();
foreach (var ev in evts)
{
ev.AddEventHandler(this, new EventHandler(OnEvent));
}
public void OnEvent(object sender, EventArgs e)
{
//..
}
, потому что ему не нравится то, что делегат является EventHandler вместо специализированного типа или потому чтоподпись метода обработчика событий не содержит специализированный тип класса EventArgs.
Можно ли это как-то сделать?
------------ ПОЗДНЕЕ РЕДАКТИРОВАНИЕ -------- Во всех трех случаях (моя попытка, предложение ds27680 и предложение Томаса Левеска) вызов AddEventHandler завершается неудачно с:
System.Reflection.TargetException occurred
Message=Object does not match target type.
Source=mscorlib
StackTrace:
at System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.EventInfo.AddEventHandler(Object target, Delegate handler)
at Test.MainWindow..ctor() in c:\users\me\documents\visual studio 2010\Projects\Test\Test\MainWindow.xaml.cs:line 39
Я предполагаю тот факт, что подпись метода обработчика событий не совпадаетТочно, тип EventArgs - это то, что делает его неудачным ...