在使用自定义委托时检查事件处理程序是否有任何订阅者
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);
}
}
}
所以想法很简单,我如何检查是否有重复的订阅者。
所以基本上如果我有
_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 公开事件
中使用此 classPublic 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);
}
}
}