- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究事件/委托(delegate)系统的更复杂用途,并且有一个我找不到解决方案的用例。
假设我有两个类,它们都处理从同一基类继承的对象:
public class VegetableStore {
List<VegType> vegtypes;
}
public class MeatStore {
List<MeatType> meatTypes;
}
// MeatType and VegType both extend abstract class FoodType
在一个单独的类中,无论何时将新的 VegType 添加到 VegetableStore,或将新的 MeatType 添加到 MeatStore,我都想监听。
现在,“简单”的方法似乎就是这样:
public class VegetableStore {
List<VegType> vegtypes;
public delegate void VegTypeAddedEventHandler(VegType vegType, bool added);
public event VegTypeAddedEventHandler VegTypeAdded;
//...
protected virtual void OnVegTypeAdded(VegType vegType, bool added) {}
}
public class MeatStore {
List<MeatType> meatTypes
public delegate void MeatTypeAddedEventHandler(MeatType meatType, bool added);
public event MeatTypeAddedEventHandler MeatTypeAdded;
//...
protected virtual void OnMeatTypeAdded(MeatType meatType, bool added) {}
}
然后在我的监听器类中...
vegStore.VegTypeAdded += OnFoodTypeAdded;
meatStore.MeatTypeAdded += OnFoodTypeAdded;
void OnFoodTypeAdded(FoodType foodType, bool added) {}
这感觉比想象的要困惑得多。
我想做的是拥有某种“父”委托(delegate),例如 FoodTypeAddedEventHandler(object source, EventArgs e)
然后能够自动订阅任何订阅此事件的事件,订阅来自 Meat 和 Veg 的事件,这样我就可以包含一个中间事件管理器类
public event FoodTypeAddedEventHandler FoodTypeAdded
{
add
{
vegStore.VegTypeAdded += value;
meatStore.MeatTypeAdded += value;
{
remove
{
vegStore.VegTypeAdded -= value;
meatStore.MeatTypeAdded -= value;
}
}
问题是。 vegStore 和 meatStore 没有 FoodTypeAddedHandler 类型的委托(delegate),因此这会导致类型错误。
有没有实用的方法来解决这个问题?似乎无法找到一个合理直接的解决方案来解决这个问题,但我觉得必须有一个。或者,我应该亲吻它吗?
最佳答案
您可以像这样使用通用委托(delegate):
delegate void FoodTypeAddedEventHandler<in T>(T meatType, bool added) where T : FoodType;
然后你有 VegTypeAddedEventHandler
而不是 FoodTypeAddedEventHandler<VegType>
而不是 MeatTypeAddedEventHandler
你有 FoodTypeAddedEventHandler<MeatType>
。最后,你得到的不是 FoodTypeAddedEventHandler
,而是 FoodTypeAddedEventHandler<FoodType>
。修改后,您的“组合”事件处理程序将编译正常:
public event FoodTypeAddedEventHandler<FoodType> FoodTypeAdded
{
add
{
vegStore.VegTypeAdded += value;
meatStore.MeatTypeAdded += value;
{
remove
{
vegStore.VegTypeAdded -= value;
meatStore.MeatTypeAdded -= value;
}
}
或者 - 只需删除所有委托(delegate)类型并使用 Action<FoodType, bool>
、 Action<VegType, bool>
和 Action<MeetType, bool>
。那么您的代码也可以正常编译。
这是可行的,因为两个自定义委托(delegate)都有其第一个类型参数( T
)逆变( in
修饰符)。这允许它接受派生类型的参数(因此,委托(delegate) FoodTypeAddedEventHandler<FoodType>
可以接受第一个参数不完全是 FoodType
而是任何派生类型(例如 VegType
)的签名。同样适用于 Action
因为在 Action
中所有类型参数也是逆变的(声明带有 in
修饰符)。有关委托(delegate)方差的更多信息,您可以在 documentation 中阅读。
关于c# - 将委托(delegate)引用传递给另一个类,以便一个订阅者可以收听多个发布者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48972086/
我有监听 unix 套接字的进程。但是,在我阅读之前,我想检查一些有关此传入消息的元数据,例如它的源进程(比如我想删除来自不受信任的发件人的消息)。是否有任何系统调用可以检索此信息。 if(l
我目前正在开发一个使用 Spring AMQP 和 RabbitMQ 的 Java 应用程序,我想监控我的队列并在某些事件发生时得到通知,比如 元素已添加到队列中, 元素被移除,或者 元素再次进入队列
我正在使用如下定义的 spring jms 监听器。它通常工作正常,但我看到它根据 recieveTimeout 设置不断断开连接和重新连接。
我如何在 Java 中监听原始打印机端口 9100。 当我在端口 9100 上创建 ServerSocket 并接受连接时,当我尝试打印到此端口时,没有任何反应。 System.out.println
问题在标题中,但要详细说明一下。如果我使用 Sun/Oracle NIO API 或类似 Netty 的框架在 Java 中编写 NIO 应用程序,是否可以让客户端作为订阅者“连接”,即使没有服务器绑
我需要收听来自 UDP 的网络广播。数据报包含一个 j4cDAC_broadcast 结构。我尝试按照一些教程进行操作,但它们似乎遗漏了一些内容并且没有非常详细的解释(如果有的话)。 我现在得到的是错
我目前正在通过带有参数的拨号协议(protocol)启动 Amazon FireTV 应用程序。可以通过这样的 Intent 在 onCreate() 中访问此参数: Intent intent =
我想听游标的任何变化。是否可以在不使用 android 中的 contentprovider 的情况下实现这一目标? 注意:(我没有使用任何数据适配器) 谢谢 最佳答案 我发现你不需要使用内容提供者。
我想在 Linux 上使用 C 中的 Libpcap 编写一个小型应用程序。 目前,它开始嗅探并等待数据包。但这并不是我真正需要的。我希望它等待 N 秒然后停止收听。 我怎样才能做到这一点? 这是我的
如何在用户关闭 Modal Bottom Sheet 时执行一段代码? showModalBottomSheet( context: context, buil
我如何在 B 类中监听来自 A 类的 PropertyChanged 事件?我想听听 A 类的属性变化。 class A : INotifyPropertyChanged { priv
当新 Activity 开始或android中的任何任务时,有没有办法通过广播或任何其他方式接收事件? 谢谢马哈茂德 最佳答案 您想做什么,一些分析或日志记录或其他什么? 好吧,如果您要监控的是您自己
我在 SWT 事件方面遇到了困难。 有没有办法在 Combo 关闭时收到通知?我需要知道它何时关闭并且选择没有更改。 我注意到有一个事件类型 SWT.Collapse,但据我所知,这只适用于 Tree
我有一个套接字,我正在尝试从客户端向服务器发送信息。两者位于同一网络,具有不同的 LAN IP(如下所示): 我的服务器是我的 C# 应用程序。 - 192.168.0.2我的客户端是我的 Andro
我是 Gstreamer 的新手,我想用它来收听 RTP 流。 为此,我使用此管道: gst-launch-1.0 udpsrc caps=application/x-rtp port=5000 !
我有一个包含大量所有级别日志记录的应用程序。我希望向 Log.Fatal 调用添加一些自定义行为。如果不构建自定义 Appender 是否可以做到这一点? 我试过这个: log4net.Uti
我有我的 android 应用程序,它监听浏览器 Intent ,以便在用户单击某种类型的 URI 时捕获它们。更具体地说,我希望我的应用程序在用户单击指向 torrent 文件的超链接(例如 htt
我想做的是以下内容:一个服务,持续监听 gps(是的:JUST gps)位置更新而不主动请求它们 - 即这个应用程序不应该消耗额外的资源电池生命周期或 CPU 时间,直到其他应用程序请求/接收 GPS
我有一个 Bootstrap 5 accordion看起来像这样: Bar ... 我正
我是 tweepy 的新手。并尝试实现一个 API,它可以监听新推文中的@提及或屏幕名称。 tweets = api.user_timeline(screen_name=username) 但它没有收
我是一名优秀的程序员,十分优秀!