-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathMessageDispatcherHelper.cs
More file actions
151 lines (138 loc) · 4.39 KB
/
Copy pathMessageDispatcherHelper.cs
File metadata and controls
151 lines (138 loc) · 4.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/*
* 作用:消息侦听/广播。
* */
using System;
using System.Collections.Generic;
namespace Helper.Core.Library
{
public class MessageDispatcherHelper
{
#region 私有属性常量
internal Dictionary<string, MessageListener> eventListenerDict;
public MessageDispatcherHelper()
{
this.eventListenerDict = new Dictionary<string, MessageListener>();
}
#endregion
#region 对外公开方法
/// <summary>
/// 添加消息侦听
/// </summary>
/// <param name="messageType">消息类别</param>
/// <param name="callback">消息处理回调函数</param>
public void addEventListener(string messageType, Action<MessageEvent> callback)
{
if (!this.eventListenerDict.ContainsKey(messageType))
{
this.eventListenerDict.Add(messageType, new MessageListener(messageType));
}
this.eventListenerDict[messageType].OnEvent += callback;
}
/// <summary>
/// 移除消息侦听
/// </summary>
/// <param name="messageType">消息类别</param>
/// <param name="callback">消息处理回调函数</param>
public void removeEventListener(string messageType, Action<MessageEvent> callback)
{
if (this.eventListenerDict.ContainsKey(messageType))
{
this.eventListenerDict[messageType].OnEvent -= callback;
// 如果没有消息侦听,则移除
if(this.eventListenerDict[messageType].ActionCount == 0)
{
this.eventListenerDict.Remove(messageType);
}
}
}
/// <summary>
/// 判断是否存在相应的消息类别
/// </summary>
/// <param name="eventType">消息类别</param>
/// <returns></returns>
public bool hasListener(string messageType)
{
return this.eventListenerDict.ContainsKey(messageType);
}
/// <summary>
/// 广播消息
/// </summary>
/// <param name="messageEvent">MessageEvent 对象</param>
/// <param name="targetObject">消息广播对象</param>
public void dispatchEvent(MessageEvent messageEvent, object targetObject)
{
if (this.eventListenerDict.ContainsKey(messageEvent.MessageType))
{
MessageListener eventListener = this.eventListenerDict[messageEvent.MessageType];
if (eventListener != null)
{
messageEvent.Target = targetObject;
eventListener.Excute(messageEvent);
}
}
}
#endregion
}
#region 逻辑处理辅助类
/// <summary>
/// 消息侦听
/// </summary>
internal class MessageListener
{
/// <summary>
/// 消息类别
/// </summary>
public string MessageType { get; set; }
public MessageListener(string messageType)
{
this.MessageType = messageType;
}
/// <summary>
/// 消息事件
/// </summary>
public event Action<MessageEvent> OnEvent;
/// <summary>
/// 获取委托数量
/// </summary>
public int ActionCount
{
get
{
if (OnEvent == null) return 0;
return OnEvent.GetInvocationList().Length;
}
}
/// <summary>
/// 触发消息
/// </summary>
/// <param name="messageEvent"></param>
public void Excute(MessageEvent messageEvent)
{
if (OnEvent != null) this.OnEvent(messageEvent);
}
}
/// <summary>
/// 消息事件
/// </summary>
public class MessageEvent
{
/// <summary>
/// 消息类型
/// </summary>
public string MessageType { get; set; }
/// <summary>
/// 消息传递数据
/// </summary>
public object MessageData { get; set; }
/// <summary>
/// 消息触发者
/// </summary>
public object Target { get; set; }
public MessageEvent(string messageType, object messageData = null)
{
this.MessageType = messageType;
this.MessageData = messageData;
}
}
#endregion
}