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

最简洁的泛型c#消息机制的更多相关文章

  1. MFC学习-第4课 消息机制和MFC作图

    转自: 1.http://blog.sina.com.cn/s/blog_6b5180bf01012kbz.html 2.http://blog.csdn.net/happyhhb/article/d ...

  2. android学习日记25--ANR和Hander消息机制

    1.ANR(Application Not Responding)定义 在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:A ...

  3. ThreadLocal ——android消息机制handler在非主线程创建not called Looper.prepare() 错误的原因

    引用自:https://www.jianshu.com/p/a8fa72e708d3 引出: 使用Handler的时候,其必须要跟一个Looper绑定.在UI线程可直接初始化Handler来使用.但是 ...

  4. Android消息机制1-Handler(Java层)(转)

    转自:http://gityuan.com/2015/12/26/handler-message-framework/ 相关源码 framework/base/core/java/andorid/os ...

  5. Android全面解析之由浅及深Handler消息机制

    前言 很高兴遇见你~ 欢迎阅读我的文章. 关于Handler的博客可谓是俯拾皆是,而这也是一个老生常谈的话题,可见的他非常基础,也非常重要.但很多的博客,却很少有从入门开始介绍,这在我一开始学习的时候 ...

  6. Android消息机制1-Handler(Java层)

    一.概述 在整个Android的源码世界里,有两大利剑,其一是Binder IPC机制,,另一个便是消息机制(由Handler/Looper/MessageQueue等构成的). Android有大量 ...

  7. iOS开发系列--通知与消息机制

    概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...

  8. Android消息传递之Handler消息机制

    前言: 无论是现在所做的项目还是以前的项目中,都会遇见线程之间通信.组件之间通信,目前统一采用EventBus来做处理,在总结学习EventBus之前,觉得还是需要学习总结一下最初的实现方式,也算是不 ...

  9. Windows消息机制

    Windows的消息系统是由3个部分组成的: · 消息队列.Windows能够为所有的应用程序维护一个消息队列.应用程序必须从消息队列中获取消息,然后分派给某个窗口.· 消息循环.通过这个循环机制应用 ...

  10. OSG消息机制之事件处理概述

    OSG的消息机制包括好多个头文件预定义及多个类. 首先,消息接收相关的类当属osgGA::GUIEventHandler和osgGA::GUIEventAdapter这两个类了.前者处理OSG程序与用 ...

随机推荐

  1. 【记录】Samba|Windows 11的Samba连接切换用户

    Samba是一个用于共享文件和打印机的网络协议,可以使不同的操作系统之间共享文件和资源变得容易.在Windows 11上,可以使用Samba来连接到网络共享. 如果您想在Windows 11上切换用户 ...

  2. 【BLIP】解读BLIP

    BLIP,全称是Bootstrapped Language-Image Pretraining,源自<BLIP: Bootstrapping Language-Image Pre-trainin ...

  3. 迭代器失效:99%的C++程序员都会踩的坑 !

    大家好,我是小康. 你踩过这个坑吗?为什么我的程序明明很简单,却总是莫名其妙地崩溃! 嘿,各位 C++ 爱好者们,今天咱们聊一个几乎所有 C++ 程序员都会踩的坑--迭代器失效.无论你是刚入门的新手, ...

  4. P10856 【MX-X2-T5】「Cfz Round 4」Xor-Forces题解

    题意: 给定一个长度为 \(n=2^k\) 的数组 \(a\),下标从 \(0\) 开始,维护 \(m\) 次操作: 给定 \(x\),设数列 \(a'\) 满足 \(a'_i=a_{i\oplus ...

  5. KMP跨平台开发中的现状调研

    Kotlin Multiplatform Development(KMP)作为一种先进的跨平台开发技术,已从2023年11月的稳定版演进至2025年更加成熟的状态.目前KMP在业务逻辑共享方面已相当成 ...

  6. select * 和 select 字段的区别

    摘要:介绍 select * 和 select 字段的区别,建议各位不要使用 select * .   在千万级表中查询数据的时候,需要千方百计提升查询效率,为用户带来最爽的体验:业界各位大佬都提到 ...

  7. AtCoder Beginner Contest 408 E-F 题解

    E. Minimum OR Path 题意 给你一个 \(N\) 个点 \(M\) 条边的无自环的无向图,第 \(i\) 条边连接 \(u_i\) 和 \(v_i\),权值为 \(w_i\). 在所有 ...

  8. python爬虫学习——xlwt库,sqlite库

    xlwt库主要是对excel进行操作,主要流程就是创建对象,创建工作表,写入数据,保存数据表.代码练习如下 ''' import xlwt workbook = xlwt.Workbook(encod ...

  9. ChatMoney,你的就业指导明灯

    本文由 ChatMoney团队出品 介绍说明 Hey!亲爱的小伙伴们,今天我要给大家带来一个职场利器--AI就业指导机器人! 在这个充满变数的职场江湖,找到一份既能养家糊口又能实现自我价值的工作是多么 ...

  10. 字典树Trie详解

    哈喽大家好,我是 doooge ,今天给大家带来 Trie 的详解. \[\Huge \texttt{字典树 Trie 详解} \] 1.Trie是什么? Trie 也叫字典树,前缀树,其本质就是一棵 ...