C#事件管理器清空所有监听的实现方法-创新互联

创新互联www.cdcxhl.cn八线动态BGP香港云服务器提供商,新人活动买多久送多久,划算不套路!

我们提供的服务有:成都网站制作、做网站、外贸营销网站建设、微信公众号开发、网站优化、网站认证、定结ssl等。为数千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的定结网站制作公司

这篇文章主要讲解了C#事件管理器清空所有监听的实现方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

C#事件使用+= -=使用起来是很方便的,但是却不能整体清空所有事件。比如一个常见的操作,打开界面注册监听事件,关闭界面需要把所有的事件清空了,这要在写一堆-=操作,如果漏清空的话肯定会造成隐患,如果在lua里这个很容易,但是C#却不行。所以我想了个办法,对Action和Func进行一次包装,就可以解决这个问题了。

这里我只封装了两个参数,大家可以继续拓展新的参数,我在项目里一共拓展了5个参数,完全够用了。

using System;
using System.Collections.Generic;
 
public class ActionManager
{
  Dictionary m_Actions = new Dictionary();
 
  public NewAction RegAction(NewAction newAction , Action action)
  {
    newAction += action;
    m_Actions[newAction] = action;
    return newAction;
  }
  public NewAction RegAction(NewAction newAction, Action action)
  {
    newAction += action;
    m_Actions[newAction] = action;
    return newAction;
  }
  public NewFunc RegAction(NewFunc newAction, Func action)
  {
    newAction += action;
    m_Actions[newAction] = action;
    return newAction;
  }
  public NewFunc RegAction(NewFunc newAction, Func action)
  {
    newAction += action;
    m_Actions[newAction] = action;
    return newAction;
  }
 
  public void Clear()
  {
    foreach (var act in m_Actions)
    {
      ((IAction)act.Key).Dispose(act.Value);
    }
  }
}
 
public interface IAction
{
  void Dispose(object obj);
}
public class NewAction : IAction
{
  Action action;
  public void Dispose(object obj)
  {
    if(obj is Action act)
      action -= act;
  }
  public void Invoke()
  {
    action?.Invoke();
  }
  public static NewAction operator +(NewAction a, Action b)
  {
    a.action -= b;
    a.action += b;
    return a;
  }
  public static NewAction operator -(NewAction a, Action b)
  {
    a.action -= b;
    return a;
  }
}
public class NewAction : IAction
{
  Action action;
  public void Dispose(object obj)
  {
    if (obj is Action act)
      action -= act;
  }
  public void Invoke(T1 t1)
  {
    action?.Invoke(t1);
  }
  public static NewAction operator +(NewAction a, Action b)
  {
    a.action -= b;
    a.action += b;
    return a;
  }
  public static NewAction operator -(NewAction a, Action b)
  {
    a.action -= b;
    return a;
  }
}
public class NewFunc : IAction
{
  Func func;
  public void Dispose(object obj)
  {
    if (obj is Func act)
      func -= act;
  }
  public T1 Invoke()
  {
    return func != null ? func.Invoke() : default(T1);
  }
  public static NewFunc operator +(NewFunc a, Func b)
  {
    a.func -= b;
    a.func += b;
    return a;
  }
  public static NewFunc operator -(NewFunc a, Func b)
  {
    a.func -= b;
    return a;
  }
}
public class NewFunc : IAction
{
  Func func;
  public void Dispose(object obj)
  {
    if (obj is Func act)
      func -= act;
  }
  public T2 Invoke(T1 t1)
  {
    return func != null ? func.Invoke(t1) : default(T2);
  }
  public static NewFunc operator +(NewFunc a, Func b)
  {
    a.func -= b;
    a.func += b;
    return a;
  }
  public static NewFunc operator -(NewFunc a, Func b)
  {
    a.func -= b;
    return a;
  }
}

文章标题:C#事件管理器清空所有监听的实现方法-创新互联
链接URL:http://pwwzsj.com/article/didsdj.html