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. 流的使用之“如何将List<String>转为Map”

    流的使用之"如何将List<String>转为Map" ProductIllegalCustom query = new ProductIllegalCustom(); ...

  2. json格式转为List集合

    一.JSON格式 {"code":"200","msg":"success","data":[&qu ...

  3. ASP.NET Core已有数据库,却新建项目

    ASP.NET Core已有数据库,却新建项目,只需要构造出相应的类,DbContext,然后直接add-migration init即可!!而不用执行update-database,执行后者会报错: ...

  4. ASP.NET Core中DI中Add*方法对类的假定

    在ASP.NET Core的依赖注入(DI)容器中,当你使用Add*方法和泛型类型来指定要注册的类时,容器会做出以下假设: (1)类必须是具体类(Concrete Class):使用Add*方法注册的 ...

  5. Spring注解之获取自定义注解信息

    目录 前言 由反射获取自定义注解 结束语 前言   在了解了自定义注解的入门知识后,以实践的形式,介绍一下通过反射技术获取自定义注解的常用API,例如如何获取自定义注解的成员变量值等等. 由反射获取自 ...

  6. linux安全基线自查手册

    1.Redhat/CentOS 7.x配置模板 1.1 帐号管理 1.1.1 检查是否设置除root之外UID为0的用户 严重级别:中危 理论依据:任何UID为0的帐户都具有系统上的超级用户特权,只有 ...

  7. 插件分享 | 善用 VSCode 内置的效率神器 Emmet 插件提升前端开发效率

    在 VSCode 出现之前,Emmet 插件就在前端领域玩得风生水起,当时的 Sublime Text 装上此插件,前端的编码效率那感觉就如同 2G 网络到 5G 网络的差别一般. 后来 VSCode ...

  8. 题解:AT_cf16_exhibition_final_e Water Distribution

    题目链接:link. 这道题目我们有 \(3\) 个结论: 在最优情况下,最后所有的点上的水量都是一样的.因为水多的可以向水少的运水. 不存在间接运水的情况,这个由三角形的三边关系可以得到. 最优运输 ...

  9. 2025年最值得关注的效率神器排行榜,HR和运营人都在偷偷用

    在职场节奏越来越快的当下,效率工具已经成为打工人提升工作表现的"刚需".无论你是HR.运营.市场.产品经理,还是独立工作者,选对一款好用的效率神器,往往能省下大量时间.提升工作成就 ...

  10. 不写代码,让 AI 生成手机 APP!保姆级教程

    你现在看到的 APP,是我完全用 AI 生成的,一行代码都没写!怎么做到的呢? 大家好,我是程序员鱼皮.AI 发展很快,现在随随便便就能生成一个网站,但是怎么纯用 AI 开发能在手机上运行的 APP ...