我有一种情况,多个类正在注册另一个类的兴趣,以观察某个属性的值。这是通过使用像这样的代表来完成的:
public delegate void ObservingHandler (object value);
Dictionary<ObservingHandler, ObservationInfo> _handlers = new Dictionary<ObservationHandler, ObservationInfo>();
public void register(ObservingHandler handler) {
// Observation info is created here and is just a struct
_handlers.Add(handler, info);
}
这非常有用并且非常有用但是当前发布注册对象时,它必须告诉相关类它不再想要接收通知。否则我会得到NULL引用异常。
目前这意味着我不能使用lambda表达式,因为观察处理程序是字典中的键(因此在删除它时需要是相同的实例)。
我想要做的是在调用之前检查每个ObservationHandler
后面是否有一个有效且实例化的类。这样一来,责任就从听力课上消失了。
在Func
或delegate
中是否有某种方法可以检查该函数的接收器是否还活着?
编辑:
完整的源代码来自我的项目SFCore on GitHub。
答案 0 :(得分:1)
我会使用.NET事件模型并让责任留在听众身上,毕竟如果您的测试因任何原因失败,您的接收器将不会再被通知。
我会做的是,在通知听众时,抓住可能出现的任何例外情况。
如果由于某个类不再存在而导致的异常(不能更具体,您没有给我们提供确切的异常名称),那么您将忽略它(认为它只是一次性的错误)或将其从字典中删除。
这就是我要做的事情,肯定有其他方法可以实现这一目标。
答案 1 :(得分:0)
Observer pattern in C#是通过事件实现的。
根据您的描述建议使用event
关键字。
您不需要像在示例中那样跟踪保持字典的级别的回调。您在通话中所做的就是:解雇活动。