У меня есть ситуация, когда несколько классов регистрируют интерес к другому классу для наблюдения за значением определенного свойства. Это делается с помощью делегатов, как так:C# проверить, имеет ли делектор/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 ссылочные исключения.
В настоящее время это означает, что я не могу использовать лямбда-выражения, потому что обработчик наблюдения является ключом в словаре (и поэтому должен быть тем же самым экземпляром, когда дело доходит до его удаления).
Что бы я хотел сделать, это проверить, что каждый ObservationHandler
имеет действительный и созданный экземпляр класса позади него до его вызова. Таким образом, ответственность отнимает класс слушателей.
Есть ли способ в Func
или delegate
, чтобы проверить приемник функции живой и хорошо?
EDIT:
Полный исходный код приходит от моего проекта под названием SFCore on GitHub.
«В противном случае я получаю эксплименты» - какие исключения? Не совсем понятно, что вы имеете в виду - пожалуйста, покажите [mcve], демонстрирующую проблему. –
«ObservingHandler» - это ссылка на метод в классе наблюдения. Если класс наблюдения освобожден, «ObservingHandler» содержит ссылку на метод в нулевом классе. Я считаю, что исключение - это исключение с нулевой ссылкой. Поэтому прямо сейчас у меня должен быть класс регистрации перед деблокированием, но я хотел бы узнать, есть ли у ObservingHandler встроенный наблюдатель. –
Вместо того, чтобы «верить», что исключение является исключением NullReferenceException, почему бы вам не показать нам пример? Я ожидал бы ссылки ObservingHandler, чтобы сохранить цель живой автоматически - здесь нет «выпуска». В принципе, пока вы не сможете воспроизвести проблему в сжатой форме, вам будет очень сложно помочь. –