如何在ErrorMsg事件处理中获取触发事件的Machine实例?
解决事件触发时获取Machine实例的问题
有两种实用方式可以让你在事件处理方法中拿到触发事件的Machine实例:
方法一:用Lambda表达式包装事件处理逻辑
在绑定事件时,通过Lambda捕获当前循环中的Machine实例,再传递给处理方法:
for (int iii = 1; iii <= pcdApplication.Machines.Count; iii++) { Machine machine = pcdApplication.Machines.Item(iii); machineList.Add(machine); // 用Lambda捕获当前machine,再调用处理方法 machine.ErrorMsg += (msg, errorType) => Machine_ErrorMsg(machine, msg, errorType); }
然后修改事件处理方法的签名,增加Machine参数:
private void Machine_ErrorMsg(Machine sender, string Msg, int ErrorType) { // 这里可以直接使用sender的属性,比如 sender.Id、sender.Name 等 ... }
方法二:修改事件定义(如果有权限)
如果你能修改ErrorMsg事件的定义,建议遵循.NET事件的标准模式,把触发实例作为第一个参数:
// 重新定义事件(如果允许) public event Action<Machine, string, int> ErrorMsg; // 触发事件的地方调整为 ErrorMsg?.Invoke(this, msg, errorType);
这样原有的绑定方式无需修改,直接在处理方法中拿到触发实例:
private void Machine_ErrorMsg(Machine sender, string Msg, int ErrorType) { ... }
注意:如果无法修改事件定义,优先使用方法一,这是无需改动原有事件结构的快捷方案。
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

