"听力"在字段所属的对象之外使用eventhandler进行字段更改

时间:2018-05-23 11:51:48

标签: c# events listener event-listener

我正在开发一个C#项目模块,该模块旨在能够成为"附加的"到不同的项目。通过将其包含在命名空间中,用户将能够实例化MonitoringModule类型的对象 这个对象是为了能够将设备写入它应该"监视"。我正在跟踪设备类型枚举,当设备被提供给MonitoringModule时,它期望设备类型参数知道它应该在该设备上监视哪些字段。
每个设备都扩展了IDevice接口,迫使它拥有标准设备字段(名称和类型,固件版本,序列号等)。这些字段是私有的,但有一个全局的getter和setter。全局setter是这样写的(Display是一个示例设备类型):

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"))
        }
    }
}

反过来,MonitoringModule有一个监听器,只要提示监控新设备,它就会订阅监听器

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
    {
}

这完全按预期工作,但我想知道是否有一种方法可以做到这一点,而不必在所有需要监视的所有需要​​监视的字段上编写公共Setter的第二个被监控。与之前需要完成的工作相比,它已经是一个非常大的改进,但我想更加努力,并删除实现该模块所需的所有手写更改。
到目前为止,我设法找到this网站似乎正在寻找我正在寻找的东西,但感觉我在解释中遗漏了一些东西,因为我做了不完全理解它是如何工作的。

1 个答案:

答案 0 :(得分:0)

这是我要做的。您是否IDevice实施了INotifyPropertyChanged。 (阅读链接)

您想要观看的所有设备都具有相同的属性吗? 然后有一个基类:class abstract DeviceBase : IDevice

您也可以编写自己的Set方法,这样可以避免每个setter中的两行代码。 MVVM light工具包有这样一种方法:http://www.mvvmlight.net/help/WP8/html/4162331c-43b6-7806-f488-8f6426aa0304.htm