2012-07-02 3 views
1

У меня есть абстрактный класс Capability, который моделирует каждую возможность физического устройства. Затем у меня есть подклассы, такие как InputSwitch и TemperatureSensor, которые могут запускать разные события.Перечисление событий класса во время выполнения

InputSwitch довольно прост - при нажатии физического переключателя объект, представляющий его, вызывает событие Triggered.

TemperatureSensor несколько сложнее, поскольку он имеет два события: TemperatureOK и TemperatureAlarm.

Есть не только эти два подкласса, каждый из которых имеет различные события, которые они могут поднять. Также может быть больше экземпляров любого из подклассов, добавленных во время выполнения.

Конечный пользователь должен уметь указывать, что (если что-либо) происходит, когда эти события запускаются, и поэтому по существу я ищу, чтобы пользователь мог просматривать возможные события во всех экземплярах Capability. Каждая возможность в настоящее время хранится в List<Capability>.

Есть ли способ перечислить доступные события?

+1

Я не думаю, что использование отражения для получения списка всех событий является жизнеспособным подходом. Что делать, если вы добавляете события, которые не следует выбирать? Используйте список событий, определенный вручную. –

+0

Я не понял, что вы хотите точно, вы хотите перечислить события своего класса? или просто поднятые события экземпляра класса? –

+0

@TimSchmelter - Я понимаю, что вы имеете в виду, но эти классы специально разработаны так, чтобы все события были доступны для конечного пользователя, чтобы назначать действия против. Я действительно не хотел дублировать в список, определенный вручную. @DotNeter - доступные события для каждого экземпляра класса - поэтому каждый экземпляр «TemperatureSensor» будет иметь два события «TemperatureOK» и «TemperatureAlarm» и т. Д. –

ответ

1

Я предлагаю вам сохранить словарь заклиненного конкретных типов ваших объектов Capability, содержащий список событий, применимый для каждого типа бетона:

например экземпляр ConcurrentDictionary<Type, EventInfo[]>

Вы бы заполнить это только один раз при запуске, вызывая Type.GetEvents по каждому конкретному типу Capability, используемом в вашей системе (или типы возможностей могут быть добавлены во время выполнения с помощью какого-то механизма плагин, добавить события для каждого тип плагина для словаря при регистрации плагина).

После этого, когда функция выбрана из вашего List<Capability>, вы можете просто просмотреть доступные события для этого объекта устройства в словаре.

+0

Я не думал каталогизировать их при запуске, Благодарю вас за эту идею. –

Смежные вопросы