最简洁的泛型c#消息机制
using System;
using System.Collections;
public class EventSystem {
public delegate void ListenerDelegate();
public delegate void ListenerDelegate<T>(T t);
public delegate void ListenerDelegate<T1, T2>(T1 t1, T2 t2);
public delegate void ListenerDelegate<T1, T2, T3>(T1 t1, T2 t2, T3 t3);
private Hashtable listeners = new Hashtable();
#region Addlistener
public void AddListener(string eventName, ListenerDelegate listener) {
ListenerDelegate listenerDelegate = listeners[eventName] as ListenerDelegate;
listenerDelegate = (ListenerDelegate)Delegate.Combine(listenerDelegate, listener);
listeners[eventName] = listenerDelegate;
}
public void AddListener<T>(string eventName, ListenerDelegate<T> listener) {
ListenerDelegate<T> listenerDelegate = listeners[eventName] as ListenerDelegate<T>;
listenerDelegate = (ListenerDelegate<T>)Delegate.Combine(listenerDelegate, listener);
listeners[eventName] = listenerDelegate;
}
public void AddListener<T1,T2>(string eventName, ListenerDelegate<T1,T2> listener) {
ListenerDelegate<T1,T2> listenerDelegate = listeners[eventName] as ListenerDelegate<T1,T2>;
listenerDelegate = (ListenerDelegate<T1,T2>)Delegate.Combine(listenerDelegate, listener);
listeners[eventName] = listenerDelegate;
}
public void AddListener<T1,T2,T3>(string eventName, ListenerDelegate<T1,T2,T3> listener) {
ListenerDelegate<T1,T2,T3> listenerDelegate = listeners[eventName] as ListenerDelegate<T1,T2,T3>;
listenerDelegate = (ListenerDelegate<T1,T2,T3>)Delegate.Combine(listenerDelegate, listener);
listeners[eventName] = listenerDelegate;
}
#endregion
#region RemoveListener
public void RemoveListener(string eventName, ListenerDelegate listener) {
Delegate remove = Delegate.Remove(listeners[eventName] as ListenerDelegate, listener);
SetRemoveValue(eventName, remove);
}
public void RemoveListener<T>(string eventName, ListenerDelegate<T> listener) {
var remove = Delegate.Remove(listeners[eventName] as ListenerDelegate<T>, listener);
SetRemoveValue(eventName, remove);
}
public void RemoveListener<T1, T2>(string eventName, ListenerDelegate<T1, T2> listener) {
Delegate remove = Delegate.Remove(listeners[eventName] as ListenerDelegate<T1, T2>, listener);
SetRemoveValue(eventName, remove);
}
public void RemoveListener<T1, T2, T3>(string eventName, ListenerDelegate<T1, T2, T3> listener) {
Delegate remove = Delegate.Remove(listeners[eventName] as ListenerDelegate<T1, T2, T3>, listener);
SetRemoveValue(eventName, remove);
}
private void SetRemoveValue(string eventName, Delegate remove) {
if (remove == null) {
listeners.Remove(eventName);
} else {
listeners[eventName] = remove;
}
}
#endregion
public void RemoveAllListener(string eventName) {
listeners.Remove(eventName);
}
public void Dispatch(string eventName)
{
if (listeners.ContainsKey(eventName)) {
ListenerDelegate listenerDelegate = listeners[eventName] as ListenerDelegate;
listenerDelegate();
}
}
public void Dispatch<T>(string eventName, T t) {
if (listeners.ContainsKey(eventName)) {
ListenerDelegate<T> listenerDelegate = listeners[eventName] as ListenerDelegate<T>;
listenerDelegate(t);
}
}
public void Dispatch<T1, T2>(string eventName, T1 t1, T2 t2) {
if (listeners.ContainsKey(eventName)) {
ListenerDelegate<T1,T2> listenerDelegate = listeners[eventName] as ListenerDelegate<T1,T2>;
listenerDelegate(t1, t2);
}
}
public void Dispatch<T1, T2, T3>(string eventName, T1 t1, T2 t2, T3 t3) {
if (listeners.ContainsKey(eventName)) {
ListenerDelegate<T1,T2,T3> listenerDelegate = listeners[eventName] as ListenerDelegate<T1,T2,T3>;
listenerDelegate(t1, t2, t3);
}
}
}
最多支持3个参数,再多我认为要写结构体了
Delegate.Combine和+= 是有区别的 https://www.coder.work/article/1627775
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
2020-11-30 unity使用async await异步unitywebrequest 加载 streamingAssets文件,取代 WWW 和 协程
2017-11-30 Unity运用GPU代替CPU处理和计算简单测试
2017-11-30 消息机制的优化----------无需进行装箱/拆箱的 版本