Я пытаюсь отменить подписку на мой метод. У меня есть этот код:Отказаться от подписки на оригинальное событие, когда попробуйте отказаться от подписки на переменную этого EventHandler
public event EventHandler MenuItemSelectionChanged;
var eh = MenuItemSelectionChanged;
eh -= TheMethod;
После запуска выше код результата:
MenuItemSelectionChanged: Is Not Null
эш: Is Null
Но я хочу отказаться от подписки TheMethod
от MenuItemSelectionChanged
, используя eh
(указатель на EventHandler). Как я могу использовать eh
удалить TheMethod
из eh
и MenuItemSelectionChanged
мне нужен этот результат:
MenuItemSelectionChanged: Is Null
эль: Is Null
Мой главный сценарий:
Внутри TargetClass.cs
:
public event EventHandler MenuItemSelectionChanged;
public void UnsubscribeFromEvent(ThisClassEventHandlerNames eventHandlerName, Dictionary<FrameworkElement, MethodInfo> eventHandlerInfos)
{
var eh = GetEventHandler(eventHandlerName);
if (eh == null) return;
foreach (var eventHandlerInfo in eventHandlerInfos)
{
var info = eventHandlerInfo;
if (eh == null)
break;
var invocationList = eh.GetInvocationList().Where(x =>
Equals(x.Target, info.Key) &&
x.Method == info.Value);
foreach (var myDeligate in invocationList)
{
if (eh == null)
break;
// I HAVE A PROBLEM HERE>>
eh -= (EventHandler) myDeligate;
// RESULT: eh is null BUT MenuItemSelectionChanged is not null
}
}
}
public enum ThisClassEventHandlerNames
{
MenuItemSelectionChanged
}
private EventHandler GetEventHandler(ThisClassEventHandlerNames eventHandlerName)
{
EventHandler result = null;
switch (eventHandlerName)
{
case ThisClassEventHandlerNames.MenuItemSelectionChanged:
{
result = MenuItemSelectionChanged;
break;
}
default:
{
result = null;
break;
}
}
return result;
}
Я называю приведенный выше код в моем WPF пользовательских элементов управления с некоторыми кодами, как это:
Внутри MyUserControl.cs
:
TargetClassObject.UnsubscribeFromEvent(
TargetClass.ThisClassEventHandlerNames.MenuItemSelectionChanged,
new Dictionary<FrameworkElement, MethodInfo>
{
{
this,
Infrastructure.Utility.GetMethodInfo<MyUserControl>(x => x.MenuControl_MenuItemSelectionChanged(null, null))
}
});
Действительно я хочу отказаться от подписки метод из события путем вызова, метод внутри этого класса (targetClass
) по этим параметрам:
A) Значение перечисления (чтобы получить событие от него)
B) инфо метод (отписать свой метод от случая)
Примечание: Моя платформа C#, WPF, .NET Framework 4.5