是否有可能编写自定义事件,以便在后进先出的基础上调用事件处理程序?

本文关键字:基础上 后进先出 调用 事件处理 程序 有可能 自定义 事件 是否 | 更新日期: 2023-09-27 18:03:06

我想创建一些自定义事件,它将始终以事件注册的相反顺序调用已注册的事件处理程序,即最近注册的事件处理程序总是首先调用。这可能吗?这些事件将由业务层类在某些错误条件下引发,其中注册的事件处理程序可能能够克服错误条件。

这是一个纯粹的技术问题,这样做是否可能?是否有可能覆盖事件链调用顺序?语言(任何版本的c# 2.0、3.0、4.0)是否支持这个特性?编辑:

可能用于错误报告和错误恢复。例如,函数A调用函数B,而函数B调用函数C。函数C可能会遇到一个错误条件,并有一个事件。如果函数A和函数B能够提供错误恢复机制,则它们将注册该事件。由于Func B更有可能具有解决错误的上下文,因此我想调用最近注册的处理程序并检查事件参数以查看错误是否已解决。如果是,我甚至不会调用其他事件处理程序。如果没有,我将调用第二个最近注册的处理程序,这将是调用者的调用函数,即Func a。

在大多数情况下,代码的结构通常是这样的:如果Func a调用了Func B,那么Func B不会调用Func a,也就是说,循环调用通常不存在,事件处理程序的顺序将与函数调用的顺序相同。因此,如果Func A调用了Func B,而Func C又调用了Func C,并且Func C引发了一个"错误事件",那么处理这个错误的最合适的候选函数是Func B的事件处理程序,然后是Func A的事件处理程序,以此类推。

它类似于堆栈跟踪的展开,并为最近的调用函数提供了使用事件的机会。任何没有。的调用函数

事件被任何处理程序成功使用后,引发"error事件"的函数C将继续。它将检查Event参数来确定这一点。如果没有处理程序使用该事件,Func将抛出异常。

是否有可能编写自定义事件,以便在后进先出的基础上调用事件处理程序?

是的,您可以通过使用MulticastDelegate.GetInvocationList()方法来迭代事件的调用列表。这样的:

    public event EventHandler Custom;
    protected virtual void OnCustom(EventArgs e) {
        var handler = Custom;
        if (handler != null) {
            var subscribers = handler.GetInvocationList();
            for (int ix = subscribers.Length - 1; ix >= 0; --ix) {
                var sub = (EventHandler)subscribers[ix];
                sub(this, e);
            }
        }
    }

请注意,这是一个不确定的解决方案,您无法控制其他代码订阅事件的顺序。