使用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方法。
一次性私人课程可以使用,可重复使用的通用课程会很棒。
如何创建一个包装类(用于事件)来隐藏公共(或内部)用法的事件?
答案 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));
}
}
}