日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自定义的事件管理器

發布時間:2023/11/29 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自定义的事件管理器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

            自定義的事件管理器

              周銀輝

?

大多數框架下都提供了事件管理器的,但不使用框架時為了讓事件發送者和事件接收者之間解耦,就可以如下寫個簡單的

public enum EventAdministratorEventTypes{ApplicationStartup, //在這里添加你需要的事件}public class EventAdministratorEventArgs : EventArgs{public object Arg{get;protected set;}public EventAdministratorEventArgs(object arg){Arg = arg;}}public class EventAdministrator{private static EventAdministrator instance;public static EventAdministrator Instance{get { return instance ?? (instance = new EventAdministrator()); }}/// <summary>/// 用于存儲event和它對于的回調函數列表的字典(event 和 callback是一對多的關系)/// </summary>private readonly Dictionary<EventAdministratorEventTypes, List<EventHandler<EventAdministratorEventArgs>>> eventAndCallbackBuffer = new Dictionary<EventAdministratorEventTypes, List<EventHandler<EventAdministratorEventArgs>>>();private void AddCallbackForEvent(EventAdministratorEventTypes eventName,EventHandler<EventAdministratorEventArgs> callback){if (!eventAndCallbackBuffer.ContainsKey(eventName)){eventAndCallbackBuffer.Add(eventName, new List<EventHandler<EventAdministratorEventArgs>>());}var callbackList = eventAndCallbackBuffer[eventName];//添加時判定不存在為了防止多次注冊后引起多次調用回調函數if (!callbackList.Contains(callback)){callbackList.Add(callback);}}/// <summary>/// 注冊為事件接受者/// </summary>/// <param name="eventName">事件名稱</param>/// <param name="callback">事件發生時的回調函數</param>public void Register(EventAdministratorEventTypes eventName, EventHandler<EventAdministratorEventArgs> callback){AddCallbackForEvent(eventName, callback);}/// <summary>/// 觸發一個事件/// </summary>/// <param name="sender">觸發者</param>/// <param name="eventName">事件名稱</param>/// <param name="args">觸發該事件時所帶的參數</param>public void Send(object sender, EventAdministratorEventTypes eventName, EventAdministratorEventArgs args){if (!eventAndCallbackBuffer.ContainsKey(eventName)){Logger.Warning("EventAdministrator:事件"+eventName+"被觸發,但沒有任何對象注冊該事件." +" 導致這個情況的原因可能有:代碼中沒有調用相應的Register函數來注冊該事件; 或者 事件的Send函數發生在Register之前");return;}var callbackList = eventAndCallbackBuffer[eventName];foreach (var callback in callbackList){callback.Invoke(sender, args);}}} }

?

?

總結

以上是生活随笔為你收集整理的自定义的事件管理器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。