【问题标题】:func<bool> events and a headachefunc<bool> 事件和头痛
【发布时间】:2024-04-23 23:00:01
【问题描述】:

我有一个布尔事件,我试图单独调用每个订阅者,这样即使一个订阅者返回 false,我也可以返回 false。到目前为止,我的尝试只剩下一个累了,想哭,吃馅饼(然后再哭)的大脑。

对于实际调用事件的函数,我一直在这样做:

foreach (Delegate sub in SomeBooleanEvent.GetInvocationList())
             {
                 someBool = sub;
                 //blah blah blah code blah blah blah
                 }
             }

我得到的错误是:

CS0029:无法将类型“System.Delegate”隐式转换为“bool”

我很困惑...帮帮我...拜托...????

编辑: 在终于鼓起勇气解决这个问题后,我发现使用func&lt;bool&gt; 而不是Delegate 似乎部分有效。

但是,我现在遇到了一个新问题。当我调用事件时,只有一个订阅者在场/被调用?

【问题讨论】:

  • 你的错误很清楚,你不能将委托分配给bool变量
  • SomeBooleanEvent 是如何声明的?
  • 您将变量someBool 分配给实际的委托。你需要调用它来获得结果:someBool = sub();(注意括号)。
  • 在 BCL(例如 System.ComponentModel.CancelEventHandler)中,需要返回状态的事件使用 EventArgs 派生参数上的属性。您应该改用此模式。使用带返回值的委托类型是让您头疼的原因。它可以而且应该避免。

标签: c# events boolean iteration return-type


【解决方案1】:

我终于弄清楚发生了什么。 对于那些可能觉得这很有用的人,应该使用func&lt;bool&gt; 而不是Delegate(我在上次编辑之前所做的代码没有调用订阅者,因为我不小心删除了一个会调用每个方法的代码块)。

简单地做

public event Func<bool> onAWildBooleanEvent;

public bool? AWildBooleanEVent(){
            bool? result = null;
            if(daBool!=null){
                foreach (Func<bool> sub in onAWildBooleanEvent.GetInvocationList())
                {
                    if(result == null){
                        result = sub();
                    }else{
                        if(sub()!=result){
                            result= false;
                        }
                    }

                }
                return AoNBool;
            }
            return null;
        }  

只要您不需要事件处理程序和事件参数,这应该适用于其他类型。只需确保将 func 设置为适当的类型即可。此外,如果您希望触发所有事件,请确保调用它们。否则,他们将不会收到该事件的通知。

【讨论】: