我有一个应用程序,它将定期创建将订阅静态引用类的对象'像这样的事件:
protected override void OnSubscribeToggle(bool subscribe)
{
if (subscribe)
{
SomeSingleton.Instance.SomeValueAChanged += OnSomeSingleton_SomeValueAChanged;
SomeSingleton.Instance.SomeValueBChanged += OnSomeSingleton_SomeValueBChanged;
SomeSingleton.Instance.SomeValueCChanged += OnSomeSingleton_SomeValueCChanged;
//...
}
else
{
SomeSingleton.Instance.SomeValueAChanged -= OnSomeSingleton_SomeValueAChanged;
SomeSingleton.Instance.SomeValueBChanged -= OnSomeSingleton_SomeValueBChanged;
SomeSingleton.Instance.SomeValueCChanged -= OnSomeSingleton_SomeValueCChanged;
//...
}
}
我的问题是,通过此设置,我必须拥有订阅或取消订阅的相同订阅列表的几乎完整副本。如果没有复杂的单元测试,确保所有线条完全相同且正确无误,只需将其视线调整即可。
有没有办法将订阅切换到事件,这样我就不必(几乎)复制粘贴相同的行并希望它们匹配所有执行此操作的类?
我要做的事情如下:
// My goal (if this were valid code)
protected override void OnSubscribeToggle(bool subscribe)
{
SomeSingleton.Instance.SomeValueAChanged (subscribe ? (+=) : (-=)) OnSomeSingleton_SomeValueAChanged;
SomeSingleton.Instance.SomeValueBChanged (subscribe ? (+=) : (-=)) OnSomeSingleton_SomeValueBChanged;
SomeSingleton.Instance.SomeValueCChanged (subscribe ? (+=) : (-=)) OnSomeSingleton_SomeValueCChanged;
//...
}
答案 0 :(得分:0)
其中一个想法是以一种易于复制粘贴的方式组织代码,从而遵循一些模式(如果有人喜欢发明轮子,仍然可能会犯错误。)
所以你需要很多像这样的方法:
private void SomeValueAChangedSubscribe(bool subscribe)
{
if (subscribe)
{
SomeSingleton.Instance.SomeValueAChanged += OnSomeSingleton_SomeValueAChanged;
}
else
{
SomeSingleton.Instance.SomeValueAChanged -= OnSomeSingleton_SomeValueAChanged;
}
}
然后,您将需要存储所有此类方法:
private Action<bool>[] GetSubscribeMethods()
{
return new Action<bool>[]
{
SomeValueAChangedSubscribe,
SomeValueBChangedSubscribe,
SomeValueCChangedSubscribe,
...
};
}
然后像这样使用它:
protected override void OnSubscribeToggle(bool subscribe)
{
foreach (var subscribeMethod in GetSubscribeMethods())
{
subscribeMethod(subscribe);
}
}
因此,要添加新订阅,您需要复制粘贴订阅逻辑&amp;将新方法添加到订阅方法数组中。
不确定这是否会更好,但很有可能在这里犯错误。