使用WeakEventManager,隐藏实际事件

时间:2015-12-01 21:00:50

标签: c# .net

使用WeakEventManager时,很明显该事件使用反射(来自示例中的AddHandler)连接到nameof()。如果事件是私有的或受保护的,AddHandler不起作用。我不想暴露事件并强迫消费者使用Subscribe事件。我可以使用私有类来保存事件。

 public static event EventHandler<IntensityChangedEventArgs> OnIntensityChanged;

    public static void Subscribe_OnIntensityChanged(EventHandler<IntensityChangedEventArgs> eventHandler)
    {
        WeakEventManager<ADAHelper, IntensityChangedEventArgs>.AddHandler(instance, nameof(ADAHelper.OnIntensityChanged), eventHandler);
    }

这有效,但问题是

public static event EventHandler<IntensityChangedEventArgs> OnIntensityChanged; 公开曝光。这需要是私有的,以便事件的消费者不能直接订阅它(导致问题解决)我想强制他们使用Subscribe_OnIntensityChanged方法。

一次性私人课程可以使用,可重复使用的通用课程会很棒。

如何创建一个包装类(用于事件)来隐藏公共(或内部)用法的事件?

1 个答案:

答案 0 :(得分:0)

我实现了一个私有类。我确实尝试了一般的路由,但解决方案的语法和清晰度并不理想。私人课程可能更好,因为你只需要一个可以举办许多活动的私人课程。

 /// <summary>
    /// wrapper to keep from exposing the actual event. Want to force them to subscribe weakly
    /// </summary>
    private OnIntensityChangedEventWrapper onIntensityChangedEventWrapper = new ADAHelper.OnIntensityChangedEventWrapper();

    /// <summary>
    /// Event notifying when the intensity has changed. This event will only fire when the ADA button was pressed.
    /// </summary>
    public static void Subscribe_OnIntensityChanged(EventHandler<IntensityChangedEventArgs> eventHandler)
    {
        WeakEventManager<OnIntensityChangedEventWrapper, IntensityChangedEventArgs>.AddHandler(Instance.onIntensityChangedEventWrapper, nameof(OnIntensityChangedEventWrapper.OnIntensityChanged), eventHandler);
    }

    private class OnIntensityChangedEventWrapper
    {
        public event EventHandler<IntensityChangedEventArgs> OnIntensityChanged;

        public void Fire(Intensity intensity)
        {
            if (OnIntensityChanged != null)
            {
                OnIntensityChanged(this, new IntensityChangedEventArgs(intensity));
            }
        }
    }