• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
~Joke_crazy
爱生活,爱拉芳!
   首页    新随笔       管理     

事件管理

using System;
using System.Collections.Generic;

namespace CustomUtils
{
    /// <summary>
    /// 事件管理器
    /// </summary>
    public class EventManager
    {
        private readonly static Dictionary<string, Action<EventMessageArgs>> eventTask = new Dictionary<string, Action<EventMessageArgs>>();

        /// <summary>
        /// 注册事件
        /// </summary>
        /// <param name="eventKey">事件索引</param>
        /// <param name="actionValue">事件回调</param>
        public static void RegisterEvent(string eventKey, Action<EventMessageArgs> actionValue)
        {
            if (!eventTask.ContainsKey(eventKey))
            {
                eventTask[eventKey] = actionValue;
            }
            else
            {
                if (eventTask[eventKey] != null)
                {
                    Delegate[] dels = eventTask[eventKey].GetInvocationList();
                    foreach (Delegate del in dels)
                    {
                        if (del.Equals(actionValue))
                            return;
                    }
                }
                eventTask[eventKey] += actionValue;
            }
        }

        /// <summary>
        /// 注销事件
        /// </summary>
        /// <param name="eventKey">事件索引</param>
        /// <param name="actionValue">事件回调</param>
        public static void UnregisterEvent(string eventKey, Action<EventMessageArgs> actionValue)
        {
            if (eventTask.ContainsKey(eventKey))
            {
                eventTask[eventKey] -= actionValue;

                if (eventTask[eventKey] == null)
                {
                    eventTask.Remove(eventKey);
                }
            }
        }

        /// <summary>
        /// 触发事件
        /// </summary>
        /// <param name="eventKey">事件索引</param>
        /// <param name="args">消息内容(只在单次触发有效,若要连续传递请使用 CopyMessage )</param>
        public static void PostEvent(string eventKey, EventMessageArgs args)
        {
            if (eventTask.ContainsKey(eventKey))
            {
                eventTask[eventKey](args);
            }
            args.Dispose();
        }
    }

    /// <summary>
    /// 事件通知数据
    /// </summary>
    public class EventMessageArgs : IDisposable
    {
        public EventMessageArgs()
        {
            messages = new Dictionary<string, object>();
        }

        private Dictionary<string, object> messages;

        /// <summary>
        /// 复制
        /// </summary>
        /// <param name="msg"></param>
        public void CopyMessage(EventMessageArgs msg)
        {
            messages = msg.messages;
        }

        /// <summary>
        /// 新增或替换
        /// </summary>
        /// <param name="key">索引</param>
        /// <param name="value">新数据</param>
        public void AddOrReplaceMessage(string key, object value)
        {
            if (CheckMessage(key))
                messages[key] = value;
            else
                messages.Add(key, value);
        }

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="key">索引</param>
        public void RemoveMessage(string key)
        {
            if (CheckMessage(key))
                messages.Remove(key);
        }

        /// <summary>
        /// 获取内容
        /// </summary>
        /// <param name="key">索引</param>
        /// <returns>引用类型数据</returns>
        public object GetMessage(string key)
        {
            if (CheckMessage(key))
                return messages[key];
            else
                return null;
        }

        /// <summary>
        /// 获取内容
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="key">索引</param>
        /// <returns>数据</returns>
        public T GetMessage<T>(string key)
        {
            if (CheckMessage(key))
                return (T)messages[key];
            else
                return default(T);
        }

        /// <summary>
        /// 释放
        /// </summary>
        public void Dispose()
        {
            messages.Clear();
            messages = null;
        }

        private bool CheckMessage(string key)
        {
            return messages.ContainsKey(key);
        }
    }
}
View Code
posted @ 2018-05-28 18:14  ~Joke_crazy  阅读(473)  评论(4)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3