我可能有点想太多了,但我可以使用一些帮助来确定执行以下操作的方法/最佳方法。
我有一个事件处理程序,它附加到一个对象,该对象是另一个类的属性。在我的事件处理程序中,我需要有关导致事件的对象的其他元数据(即包含它的对象的 ID)。从发送者和事件信息中无法获得我需要的信息。我的倾向是这将是一个使用捕获变量的好地方,但我不确定我的实现想法。
因此,为了在代码中说明,我有一个事件处理程序:
void MyEventHandler(object sender, EventArgs e){
//Do Stuff here
}
(作为说明,我在这里使用基本 EventArgs,但在我的实际实现中,它是一个专门的子类,并且事件是使用通用 EventHandler 声明的)
我目前正在像这样附加它:
topObject.SubObject.EventToHandle += MyEventHandler;
我后来像这样分离它:
topObject.SubObject.EventToHandle -= MyEventHandler;
我在处理事件时想要 topObject 的 ID,所以我打算将 MyEventHandler 更改为具有以下签名:
void MyEventHandler(int id, object sender, EventArgs e)
并像这样附加事件处理程序:
topObject.SubObject.EventToHandle += (s,e) => MyEventHandler(topObject.ID, s,e);
我对此的担忧有两个方面。
- 一旦我在附加它的函数之外,处理程序实际上会消失而不删除的范围是否存在问题。过去我见过一些奇怪的错误,当我使用 lambda 表达式时,事件处理程序在我身上消失了。并非一直如此,只是在某些情况下。谁能告诉我这些情况可能是什么,以便我知道何时可以安全地使用我拥有的语法。
- 我记不清了,但我认为如果我使用这种语法,我永远不会删除事件处理程序,因为创建的隐式对象是不一样的。
由于这两个问题,我的想法是创建一个动作并保存该动作并使用它,直到我需要删除事件处理程序。我做了以下事情:
Action<object, EventArgs> handler = (s,e) => MyEventHandler(topObject.ID, s,e);
topObject.SubObject.EventToHandle += handler;
我知道该操作无法强制转换为事件处理程序。是否有一些简单的方法可以进行这种转换,仍然可以确保我可以分离事件处理程序?我只是在想这个/有没有我现在看不到的方法来做到这一点?