在使用自定义委托时检查事件处理程序是否有任何订阅者

Check if there are any subscribers to an event handler whilst using a custom delegate

所以想法很简单,我如何检查是否有重复的订阅者。

所以基本上如果我有

_moduleEvent += _coachesEvents.OnDifficultyScoreListChanged;

订阅了多个 位置,我不希望该方法被调用两次(或更多次)。

我当前的代码(研究后添加了逻辑):

        /// <summary>
        /// Delegate that points to the multiple module methods
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private delegate void ModuleEventHandler(object sender, OpportunityEventArgs args);

        /// <summary>
        /// 
        /// </summary>
        private event ModuleEventHandler _moduleEvent
        {
            add
            {
                if (_moduleEvent == null || !_moduleEvent.GetInvocationList().Contains(value))
                {
                    _moduleEvent += value;
                }
            }
            remove
            {
                _moduleEvent -= value;
            }
        }

在我检查它是否为空并检查 GetInnvocationList 的情况下,我收到一个错误,指出 _moduleEvent 应该出现在 += 等的左侧

        /// <summary>
        /// Check whether there are any subscribers
        /// </summary>
        private void _onModuleEvent(BusinessEntities.Opportunity o)
        {
            if (_moduleEvent != null)
                _moduleEvent(this, new OpportunityEventArgs() { Opportunity = o });
        }

我还看到 _moduleEvent 应该出现在上面 += 错误的左侧。

我只能假设它与自定义委托有关?如果我删除 eventHandler 中的 add/remove 显然一切正常。

非常感谢任何帮助。

我建议你应该创建字典并检查它

创建 class 如下

public class Subscription
{
  public readonly MethodInfo MethodInfo;
  public readonly WeakReference TargetObjet;

  public Subscription(Action<Tmessage> action, EventAggregator eventAggregator)
  {
      MethodInfo = action.Method;
      TargetObjet = new WeakReference(action.Target);
  }
}

而不是在 class 公开事件

中使用此 class
Public class EventExposer
{
  private Dictionary<Type, IList> subscriber;

  public EventExposer()
  {
            subscriber = new Dictionary<Type, IList>();
  }

   public void AddEvent(Action action)
   {
            Type t = typeof(action.Target);
            if (!subscriber.ContainsKey(t))
            {
                    subscriber.Add(t, action);
            }
   }

}