c# - 功能事件和头痛
问题描述
我有一个布尔事件,我试图单独调用每个订阅者,这样即使一个订阅者返回 false,我也可以返回 false。到目前为止,我的尝试只给我留下了一个疲惫的大脑,想哭,吃馅饼(然后再哭)。
对于实际调用事件的函数,我一直在这样做:
foreach (Delegate sub in SomeBooleanEvent.GetInvocationList())
{
someBool = sub;
//blah blah blah code blah blah blah
}
}
我得到的错误是:
CS0029:无法将类型“System.Delegate”隐式转换为“bool”
我很困惑...帮助我...请...
编辑:
在终于鼓起勇气解决这个问题后,我发现使用func<bool>
而不是Delegate
似乎部分有效。
但是,我现在有一个新问题。当我调用事件时,只有一个订阅者在场/被调用?
解决方案
我终于弄清楚发生了什么。对于那些可能觉得这很有用的人,func<bool>
应该使用而不是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 设置为适当的类型即可。此外,如果您希望触发所有事件,请确保调用它们。否则,他们将不会被告知该事件。
推荐阅读
- c# - c# sql server更新表连接超时
- javascript - 如何自定义 Chart.js 折线图的工具提示?
- ansible - 显示 NONE 作为缺少 ansible_facts 的值
- python - 如何将 python 连接到 MySQL 服务器
- java - 为什么通过 PUT/PATCH 路由关联后,我无法同时获得两个 Spring“多对多”实体的信息?
- r - R,ifelse 错误:一元运算符的参数无效
- php - 如何覆盖/更新选定的文件 / PHP
- c# - asp.net core razor pages - 策略授权 - 控制组织对文件夹页面的访问
- javascript - 如何使用 PEG.js 创建一个简单的解析器
- angular - Observable 受变量控制