我正在开发一个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网站似乎正在寻找我正在寻找的东西,但感觉我在解释中遗漏了一些东西,因为我做了不完全理解它是如何工作的。
答案 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