如何从C#中的Action委托中删除方法

时间:2011-12-11 15:45:54

标签: c# delegates action

  

可能重复:
  C# Adding and Removing Anonymous Event Handler

假设我有一个以这种方式声明的Action委托:

public event Action<MenuTraverser.Actions> menuAction;

我正在以这种方式关联一个方法:

menuInputController.menuAction += (MenuTraverser.Actions action) => this.traverser.OnMenuAction(action);

现在,一切正常,但在某些情况下,我需要删除委托方法,我不知道如何。 我试过这种方式但不起作用:

menuInputController.menuAction -= (MenuTraverser.Actions action) => this.traverser.OnMenuAction(action);

我怎么能做这样的事情?我需要我的方法OnMenuAction将不再被调用。

2 个答案:

答案 0 :(得分:5)

您需要将对通用委托的引用存储到字段中,以便稍后您可以使用此缓存的委托字段取消订阅:

// declare on a class fields level
Action<MenuTraverser.Action> cachedHandler; 

// in constructor initialize
cachedHandler = (action) => this.traverser.OnMenuAction(action);

// subscribe
menuInputController.menuAction += cachedHandler;

// unsubscribe
menuInputController.menuAction -= cachedHandler;

答案 1 :(得分:4)

由于您的签名似乎匹配(假设您有void返回类型),您不需要添加匿名函数,但可以直接使用方法组:

menuInputController.menuAction += this.traverser.OnMenuAction;

在这种情况下,取消订阅也应该有效:

menuInputController.menuAction -= this.traverser.OnMenuAction;