最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#事件管理器如何清空所有監(jiān)聽(tīng)詳解

 更新時(shí)間:2020年07月17日 08:52:26   作者:雨松MOMO  
這篇文章主要給大家介紹了關(guān)于C#事件管理器如何清空所有監(jiān)聽(tīng)的相關(guān)資料,文中通過(guò)示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

C#事件使用+= -=使用起來(lái)是很方便的,但是卻不能整體清空所有事件。比如一個(gè)常見(jiàn)的操作,打開(kāi)界面注冊(cè)監(jiān)聽(tīng)事件,關(guān)閉界面需要把所有的事件清空了,這要在寫(xiě)一堆-=操作,如果漏清空的話(huà)肯定會(huì)造成隱患,如果在lua里這個(gè)很容易,但是C#卻不行。所以我想了個(gè)辦法,對(duì)Action和Func進(jìn)行一次包裝,就可以解決這個(gè)問(wèn)題了。

這里我只封裝了兩個(gè)參數(shù),大家可以繼續(xù)拓展新的參數(shù),我在項(xiàng)目里一共拓展了5個(gè)參數(shù),完全夠用了。

using System;
using System.Collections.Generic;
 
public class ActionManager
{
  Dictionary<object, object> m_Actions = new Dictionary<object, object>();
 
  public NewAction RegAction(NewAction newAction , Action action)
  {
    newAction += action;
    m_Actions[newAction] = action;
    return newAction;
  }
  public NewAction<T1> RegAction<T1>(NewAction<T1> newAction, Action<T1> action)
  {
    newAction += action;
    m_Actions[newAction] = action;
    return newAction;
  }
  public NewFunc<T1> RegAction<T1>(NewFunc<T1> newAction, Func<T1> action)
  {
    newAction += action;
    m_Actions[newAction] = action;
    return newAction;
  }
  public NewFunc<T1,T2> RegAction<T1, T2>(NewFunc<T1, T2> newAction, Func<T1, T2> 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<T1> : IAction
{
  Action<T1> action;
  public void Dispose(object obj)
  {
    if (obj is Action<T1> act)
      action -= act;
  }
  public void Invoke(T1 t1)
  {
    action?.Invoke(t1);
  }
  public static NewAction<T1> operator +(NewAction<T1> a, Action<T1> b)
  {
    a.action -= b;
    a.action += b;
    return a;
  }
  public static NewAction<T1> operator -(NewAction<T1> a, Action<T1> b)
  {
    a.action -= b;
    return a;
  }
}
public class NewFunc<T1> : IAction
{
  Func<T1> func;
  public void Dispose(object obj)
  {
    if (obj is Func<T1> act)
      func -= act;
  }
  public T1 Invoke()
  {
    return func != null ? func.Invoke() : default(T1);
  }
  public static NewFunc<T1> operator +(NewFunc<T1> a, Func<T1> b)
  {
    a.func -= b;
    a.func += b;
    return a;
  }
  public static NewFunc<T1> operator -(NewFunc<T1> a, Func<T1> b)
  {
    a.func -= b;
    return a;
  }
}
public class NewFunc<T1, T2> : IAction
{
  Func<T1, T2> func;
  public void Dispose(object obj)
  {
    if (obj is Func<T1, T2> act)
      func -= act;
  }
  public T2 Invoke(T1 t1)
  {
    return func != null ? func.Invoke(t1) : default(T2);
  }
  public static NewFunc<T1, T2> operator +(NewFunc<T1, T2> a, Func<T1, T2> b)
  {
    a.func -= b;
    a.func += b;
    return a;
  }
  public static NewFunc<T1, T2> operator -(NewFunc<T1, T2> a, Func<T1, T2> b)
  {
    a.func -= b;
    return a;
  }
}

使用方法如下,注意我們自己封裝的事件必須要new。

using UnityEngine;
 
public class Main : MonoBehaviour
{
  NewAction<string> MyAction = new NewAction<string>();//事件需要new
  NewFunc<string,int> MyFunc = new NewFunc<string,int>();//事件需要new
 
 
  ActionManager m_ActionManager = new ActionManager();
 
  public void MyFunction(string str)
  {
    Debug.Log(" MyFunction " + str);
  }
  public int MyFunction1(string str)
  {
    Debug.Log(" MyFunction1 " + str);
    return 1;
  }
 
  private void OnGUI()
  {
    if (GUILayout.Button("<size=50>注冊(cè)事件</size>"))
    {
      m_ActionManager.RegAction(MyAction, MyFunction);
      m_ActionManager.RegAction(MyFunc, MyFunction1);
    }
 
    if (GUILayout.Button("<size=50>發(fā)事件</size>"))
    {
      MyAction.Invoke("參數(shù)1");
      MyFunc.Invoke("參數(shù)2");
    }
    if (GUILayout.Button("<size=50>清空</size>"))
    {
      m_ActionManager.Clear();
    }
  }
}

事件管理器可以放在UI或者模塊的基類(lèi)中,這樣子類(lèi)在寫(xiě)的時(shí)候可以直接this.RegAction注冊(cè)事件,關(guān)閉界面或者卸載模塊的時(shí)候由父類(lèi)調(diào)用Clear方法,這樣業(yè)務(wù)邏輯就不需要在寫(xiě)-=這樣的代碼了。

總結(jié)

到此這篇關(guān)于C#事件管理器如何清空所有監(jiān)聽(tīng)的文章就介紹到這了,更多相關(guān)C#事件管理器清空所有監(jiān)聽(tīng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用FlubuCore用C#來(lái)寫(xiě)DevOps腳本的方法詳解

    利用FlubuCore用C#來(lái)寫(xiě)DevOps腳本的方法詳解

    這篇文章主要介紹了利用FlubuCore用C#來(lái)寫(xiě)DevOps腳本的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • C#中四步輕松使用log4net記錄本地日志的方法

    C#中四步輕松使用log4net記錄本地日志的方法

    下面小編就為大家分享一篇C#中四步輕松使用log4net記錄本地日志的方法,具有很好的參考價(jià)值。希望對(duì)大家有所幫助
    2017-11-11
  • 如何使用LinQ To Object把數(shù)組或DataTable中的數(shù)據(jù)進(jìn)行向上匯總

    如何使用LinQ To Object把數(shù)組或DataTable中的數(shù)據(jù)進(jìn)行向上匯總

    這篇文章主要介紹了如何使用LinQ To Object把數(shù)組或DataTable中的數(shù)據(jù)進(jìn)行向上匯總,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • .NET實(shí)現(xiàn)定時(shí)發(fā)送郵件代碼(兩種方式)

    .NET實(shí)現(xiàn)定時(shí)發(fā)送郵件代碼(兩種方式)

    經(jīng)常發(fā)郵件的朋友都知道,郵箱有個(gè)特殊功能,可以設(shè)定郵件發(fā)送時(shí)間,定時(shí)發(fā)送,這個(gè)功能是怎么實(shí)現(xiàn)的呢?接下來(lái),小編給大家分享.NET實(shí)現(xiàn)定時(shí)發(fā)送郵件的代碼,有需要的朋友可以參考下
    2015-08-08
  • C#中線(xiàn)程同步對(duì)象的方法分析

    C#中線(xiàn)程同步對(duì)象的方法分析

    這篇文章主要介紹了C#中線(xiàn)程同步對(duì)象的方法,較為詳細(xì)的分析了線(xiàn)程同步的原理與實(shí)現(xiàn)方法,并給出了實(shí)例總結(jié),是比較實(shí)用的技巧,需要的朋友可以參考下
    2014-12-12
  • c#實(shí)現(xiàn)圖片的平移和旋轉(zhuǎn)示例代碼

    c#實(shí)現(xiàn)圖片的平移和旋轉(zhuǎn)示例代碼

    這篇文章主要給大家介紹了關(guān)于c#實(shí)現(xiàn)圖片的平移和旋轉(zhuǎn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • C#使用log4net結(jié)合sqlite數(shù)據(jù)庫(kù)實(shí)現(xiàn)記錄日志

    C#使用log4net結(jié)合sqlite數(shù)據(jù)庫(kù)實(shí)現(xiàn)記錄日志

    因?yàn)榻Y(jié)構(gòu)化的數(shù)據(jù)庫(kù)存儲(chǔ)的日志信息,可以寫(xiě)專(zhuān)門(mén)的軟件讀取歷史日志信息,通過(guò)各種條件篩選,可操作性極大增強(qiáng),有這方面需求的開(kāi)發(fā)人員可以考慮,本文給大家介紹了C#使用log4net結(jié)合sqlite數(shù)據(jù)庫(kù)記錄日志,需要的朋友可以參考下
    2024-10-10
  • C#集合之可觀察集合的用法

    C#集合之可觀察集合的用法

    這篇文章介紹了C#集合之可觀察集合的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C#計(jì)時(shí)器的三種實(shí)現(xiàn)方法

    C#計(jì)時(shí)器的三種實(shí)現(xiàn)方法

    這篇文章主要介紹了C#計(jì)時(shí)器的三種實(shí)現(xiàn)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-10-10
  • C#導(dǎo)入導(dǎo)出EXCEL文件的代碼實(shí)例

    C#導(dǎo)入導(dǎo)出EXCEL文件的代碼實(shí)例

    這篇文章主要介紹了C#導(dǎo)入導(dǎo)出EXCEL文件代碼實(shí)例,代碼的流程和方法都很詳細(xì),需要的朋友可以參考下
    2014-04-04

最新評(píng)論

彰化市| 山东| 兴和县| 温州市| 忻城县| 陇南市| 鹤峰县| 比如县| 泰安市| 永康市| 南岸区| 凤山市| 永靖县| 雷波县| 潮州市| 社旗县| 开原市| 新绛县| 高平市| 美姑县| 潜山县| 闻喜县| 合江县| 涞水县| 望都县| 潍坊市| 景谷| 大埔区| 永城市| 库尔勒市| 昔阳县| 沐川县| 博乐市| 信宜市| 喀喇沁旗| 吴堡县| 梁山县| 郴州市| 前郭尔| 闽侯县| 太康县|