Я работаю над проектом-модулем C #, который спроектирован так, чтобы быть в состоянии быть «привязанным» к различным проектам.Включив его в пространство имен, пользователь сможет создать экземпляр объекта MonitoringModule
-типа.
Этот объект предназначен для записи устройств, которые он должен «отслеживать».Я отслеживаю перечисление типа устройства, когда устройство передается в MonitoringModule, оно будет ожидать, что параметр типа устройства будет знать, какие поля он должен отслеживать на этом устройстве.
Каждое устройство расширяет IDevice
интерфейс, который заставляет его иметь стандартные поля устройства (имя и тип, версия прошивки, серийный номер, и тому подобное).Эти поля являются частными, но имеют глобальные методы получения и установки.Глобальный установщик записывается так (Дисплей является примером типа устройства):
public class Display : IDevice
{
private string firmware;
public event StateChangedEventHandler StateChanged;
public string Firmware
{
get { return this.firmware; }
set
{
this.firmware = value;
this.OnStateChanged(new StateChangedEventArgs(this, "firmware"))
}
}
}
Модуль мониторинга, в свою очередь, имеет прослушиватель, на который он подписывается всякий раз, когда ему предлагается отслеживать новое устройство
public class MonitoringModule
{
public void addDevice(IDevice device, DeviceType.Display deviceType)
{
//add the device to monitoringmodule
//maybe something deviceType specific
device.StateChanged += new StateChangedEventHandler(device_stateChanged);
}
void device_StateChanged(object sender, StateChangedEventArgs e)
{
//here it does things with the received e.device and it's e.changedState
{
}
Это работает отлично, как и предполагалось, но мне интересно, есть ли способ, которым я могу сделать это без необходимости писать второй подобный общедоступному сеттеру на всех полях, которые должны контролироваться, на всех устройствах, которыенужно контролировать.По сравнению с работой, которая должна была быть сделана до этого, это уже очень большое улучшение, но я хочу взять лишнюю милю и удалить все рукописные изменения, необходимые для реализации этого модуля.
Пока мне удалось найти этот веб-сайт, который, кажется, находится на правильном пути того, что я ищу, но мне кажется, что я что-то упустил в объяснении, потому что я не совсем понимаю, как это работает.