C#检查delegate / func是否有一个有效的接收器

时间:2016-04-21 15:00:13

标签: c# delegates func

我有一种情况,多个类正在注册另一个类的兴趣,以观察某个属性的值。这是通过使用像这样的代表来完成的:

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后面是否有一个有效且实例化的类。这样一来,责任就从听力课上消失了。

Funcdelegate中是否有某种方法可以检查该函数的接收器是否还活着?

编辑:

完整的源代码来自我的项目SFCore on GitHub

2 个答案:

答案 0 :(得分:1)

我会使用.NET事件模型并让责任留在听众身上,毕竟如果您的测试因任何原因失败,您的接收器将不会再被通知。

我会做的是,在通知听众时,抓住可能出现的任何例外情况。

如果由于某个类不再存在而导致的异常(不能更具体,您没有给我们提供确切的异常名称),那么您将忽略它(认为它只是一次性的错误)或将其从字典中删除。

这就是我要做的事情,肯定有其他方法可以实现这一目标。

答案 1 :(得分:0)

Observer pattern in C#是通过事件实现的。 根据您的描述建议使用event关键字。

您不需要像在示例中那样跟踪保持字典的级别的回调。您在通话中所做的就是:解雇活动。