是否可以在一行中切换事件订阅? (订阅/取消)

时间:2017-03-15 08:21:04

标签: c# events

我有一个应用程序,它将定期创建将订阅静态引用类的对象'像这样的事件:

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;
    //...
}

1 个答案:

答案 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;将新方法添加到订阅方法数组中。

不确定这是否会更好,但很有可能在这里犯错误。

相关问题