Как уже говорили другие ответы, это способ сделать это.
Но вы можете пойти дальше !!! Я только что реализовал на нем хорошую структуру данных, и это похоже на то, как вы это делаете.
Было бы неплохо иметь автоматическое всплытие событий? Вы можете реализовать это с помощью Reflection. Мой способ состоит в том, чтобы определить интерфейс / базовый класс, который объявляет событие (или набор событий). Затем конструктор без параметров базового класса будет выполнять итерации других своих свойств / полей и автоматически регистрировать события членов для распространения событий.
Есть некоторые ограничения на дизайн, но если у вас глубокая структура и / или много (структурированных) событий, было бы неплохо настроить все без какой-либо дополнительной строки кода.
Начальный базовый класс может быть:
class BaseObject {
public BaseObject() {
FieldInfo[] fInfos = this.GetType().GetFields(...);
foreach (FieldInfo fInfo in fInfos) {
object fInfoValue = fInfo.GetValue(this, null);
if (fInfoValue is BaseObject) {
BaseObject bMemberObject = (BaseObject)fInfoValue;
bMemberObject.MyEvent += new EventHandler(delegate() {
if (this.MyEvent != null)
MyEvent();
});
}
}
public event MyEvent = null;
}
Конечно, как уже предлагалось, следуйте делегату события делегат (отправитель объекта, аргументы EventArgs) (для ясности я использовал более простое событие).
Естественно, подразумевается, что ваши классы A , B и C являются производными непосредственно от BaseObject .
Обратите внимание, что любая логика может быть реализована для привязки структурированных событий (вы можете быть вложенной регистрацией событий, используя имя и / или другие отраженные свойства.