122 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C#
		
	
	
| 
 | |
| 
 | |
| namespace Guru
 | |
| {
 | |
|     using System;
 | |
|     using System.Collections.Generic;
 | |
|     
 | |
|     /// <summary>
 | |
|     /// 事件管线基类
 | |
|     /// </summary>
 | |
|     public class EventBus
 | |
|     {
 | |
| 
 | |
|         private Dictionary<string, HashSet<Delegate>> _eventDict;
 | |
|         protected Dictionary<string, HashSet<Delegate>> EventDict
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 if (_eventDict == null)
 | |
|                 {
 | |
|                     _eventDict = new Dictionary<string, HashSet<Delegate>>(20);
 | |
|                 }
 | |
|                 return _eventDict;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 发送事件
 | |
|         /// </summary>
 | |
|         /// <param name="eventBody"></param>
 | |
|         /// <typeparam name="T"></typeparam>
 | |
|         /// <returns></returns>
 | |
|         public bool Send<T>(T eventBody) where T : struct
 | |
|         {
 | |
|             return Trigger<T>(eventBody);
 | |
|         }
 | |
| 
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 订阅消息
 | |
|         /// </summary>
 | |
|         /// <param name="onReceiveMessage"></param>
 | |
|         /// <typeparam name="T"></typeparam>
 | |
|         public void Subscribe<T>(Action<T> onReceiveMessage) where T : struct
 | |
|         {
 | |
|             AddListener(onReceiveMessage);
 | |
|         }
 | |
|         
 | |
|         public void Unsubscribe<T>(Action<T> onReceiveMessage) where T : struct
 | |
|         {
 | |
|             RemoveListener(onReceiveMessage);
 | |
|         }
 | |
|         
 | |
|         public void Dispose()
 | |
|         {
 | |
|             if (_eventDict != null)
 | |
|             {
 | |
|                 foreach (var actions in _eventDict.Values)
 | |
|                 {
 | |
|                     actions.Clear();
 | |
|                 }
 | |
|                 _eventDict.Clear();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         protected bool HasEvent<T>() where T : struct
 | |
|         {
 | |
|             return EventDict.ContainsKey(nameof(T));
 | |
|         }
 | |
|         
 | |
|         
 | |
|         protected void AddListener<T>(Action<T> onReceiveMessage) where T : struct
 | |
|         {
 | |
|             if (!HasEvent<T>())
 | |
|             {
 | |
|                 EventDict[nameof(T)] = new HashSet<Delegate>();
 | |
|             }
 | |
| 
 | |
|             EventDict[nameof(T)].Add(onReceiveMessage);
 | |
|         }
 | |
|         
 | |
|         protected void RemoveListener<T>(Action<T> onReceiveMessage) where T : struct
 | |
|         {
 | |
|             if (HasEvent<T>())
 | |
|             {
 | |
|                 if (EventDict[nameof(T)].Contains(onReceiveMessage))
 | |
|                 {
 | |
|                     EventDict[nameof(T)].Remove(onReceiveMessage);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         /// <param name="message"></param>
 | |
|         /// <typeparam name="T"></typeparam>
 | |
|         /// <returns></returns>
 | |
|         protected bool Trigger<T>(T message) where T : struct
 | |
|         {
 | |
|             if (HasEvent<T>())
 | |
|             {
 | |
|                 HashSet<Delegate> newActions = new HashSet<Delegate>(EventDict[nameof(T)].Count);
 | |
|                 foreach (var d in EventDict[nameof(T)])
 | |
|                 {
 | |
|                     if (d.Target != null)
 | |
|                     {
 | |
|                         (d as Action<T>)?.Invoke(message);
 | |
|                         newActions.Add(d);
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 EventDict[nameof(T)] = newActions; // 过滤掉不存在的时间
 | |
|                 return true;
 | |
|             }
 | |
| 
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
| 
 | |
|     }
 | |
| } |