事件转发

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace RouteSystem
{
#region action define
public interface IGAction
{
void Execute();
void Execute<T1>(T1 arg1);
void Execute<T1, T2>(T1 arg1, T2 arg2);
void Execute<T1, T2, T3>(T1 arg1, T2 arg2, T3 arg3);
void Execute<T1, T2, T3, T4>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
void Execute<T1, T2, T3, T4, T5>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);
void Execute<T1, T2, T3, T4, T5, T6>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6);
void Execute<T1, T2, T3, T4, T5, T6, T7>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7);
} public class GAction : IGAction
{
Action action = null;
public GAction(Action action_) { action = action_; } public void Execute()
{ action(); }
public void Execute<U1>(U1 arg1) { }
public void Execute<U1, U2>(U1 arg1, U2 arg2) { }
public void Execute<U1, U2, U3>(U1 arg1, U2 arg2, U3 arg3) { }
public void Execute<U1, U2, U3, U4>(U1 arg1, U2 arg2, U3 arg3, U4 arg4) { }
public void Execute<U1, U2, U3, U4, U5>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5) { }
public void Execute<U1, U2, U3, U4, U5,U6>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6) { }
public void Execute<U1, U2, U3, U4, U5, U6, U7>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6, U7 arg7) { }
} public class GAction<T1> : IGAction
{
Action<T1> action = null;
public GAction(Action<T1> action_) { action = action_; } public void Execute() { }
public void Execute<U1>(U1 arg1)
{ action((T1)(object)(arg1)); }
public void Execute<U1, U2>(U1 arg1, U2 arg2) { }
public void Execute<U1, U2, U3>(U1 arg1, U2 arg2, U3 arg3) { }
public void Execute<U1, U2, U3, U4>(U1 arg1, U2 arg2, U3 arg3, U4 arg4) { }
public void Execute<U1, U2, U3, U4, U5>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5) { }
public void Execute<U1, U2, U3, U4, U5, U6>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6) { }
public void Execute<U1, U2, U3, U4, U5, U6, U7>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6, U7 arg7) { }
} public class GAction<T1, T2> : IGAction
{
Action<T1, T2> action = null;
public GAction(Action<T1, T2> action_) { action = action_; } public void Execute() { }
public void Execute<U1>(U1 arg1) { }
public void Execute<U1, U2>(U1 arg1, U2 arg2)
{ action((T1)(object)(arg1), (T2)(object)arg2); }
public void Execute<U1, U2, U3>(U1 arg1, U2 arg2, U3 arg3) { }
public void Execute<U1, U2, U3, U4>(U1 arg1, U2 arg2, U3 arg3, U4 arg4) { }
public void Execute<U1, U2, U3, U4, U5>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5) { }
public void Execute<U1, U2, U3, U4, U5, U6>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6) { }
public void Execute<U1, U2, U3, U4, U5, U6, U7>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6, U7 arg7) { }
} public class GAction<T1, T2, T3> : IGAction
{
Action<T1, T2, T3> action = null;
public GAction(Action<T1, T2, T3> action_) { action = action_; } public void Execute() { }
public void Execute<U1>(U1 arg1) { }
public void Execute<U1, U2>(U1 arg1, U2 arg2) { }
public void Execute<U1, U2, U3>(U1 arg1, U2 arg2, U3 arg3)
{ action((T1)(object)(arg1), (T2)(object)arg2, (T3)(object)arg3); }
public void Execute<U1, U2, U3, U4>(U1 arg1, U2 arg2, U3 arg3, U4 arg4) { }
public void Execute<U1, U2, U3, U4, U5>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5) { }
public void Execute<U1, U2, U3, U4, U5, U6>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6) { }
public void Execute<U1, U2, U3, U4, U5, U6, U7>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6, U7 arg7) { }
} public class GAction<T1, T2, T3, T4> : IGAction
{
Action<T1, T2, T3, T4> action = null;
public GAction(Action<T1, T2, T3, T4> action_) { action = action_; } public void Execute() { }
public void Execute<U1>(U1 arg1) { }
public void Execute<U1, U2>(U1 arg1, U2 arg2) { }
public void Execute<U1, U2, U3>(U1 arg1, U2 arg2, U3 arg3) { }
public void Execute<U1, U2, U3, U4>(U1 arg1, U2 arg2, U3 arg3, U4 arg4)
{ action((T1)(object)(arg1), (T2)(object)arg2, (T3)(object)arg3, (T4)(object)arg4); }
public void Execute<U1, U2, U3, U4, U5>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5) { }
public void Execute<U1, U2, U3, U4, U5, U6>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6) { }
public void Execute<U1, U2, U3, U4, U5, U6, U7>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6, U7 arg7) { }
} public class GAction<T1, T2, T3, T4, T5> : IGAction
{
Action<T1, T2, T3, T4, T5> action = null;
public GAction(Action<T1, T2, T3, T4, T5> action_) { action = action_; } public void Execute() { }
public void Execute<U1>(U1 arg1) { }
public void Execute<U1, U2>(U1 arg1, U2 arg2) { }
public void Execute<U1, U2, U3>(U1 arg1, U2 arg2, U3 arg3) { }
public void Execute<U1, U2, U3, U4>(U1 arg1, U2 arg2, U3 arg3, U4 arg4) { }
public void Execute<U1, U2, U3, U4, U5>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5)
{ action((T1)(object)(arg1), (T2)(object)arg2, (T3)(object)arg3, (T4)(object)arg4, (T5)(object)arg5); }
public void Execute<U1, U2, U3, U4, U5, U6>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6) { }
public void Execute<U1, U2, U3, U4, U5, U6, U7>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6, U7 arg7) { }
} public class GAction<T1, T2, T3, T4, T5, T6> : IGAction
{
Action<T1, T2, T3, T4, T5, T6> action = null;
public GAction(Action<T1, T2, T3, T4, T5, T6> action_) { action = action_; } public void Execute() { }
public void Execute<U1>(U1 arg1) { }
public void Execute<U1, U2>(U1 arg1, U2 arg2) { }
public void Execute<U1, U2, U3>(U1 arg1, U2 arg2, U3 arg3) { }
public void Execute<U1, U2, U3, U4>(U1 arg1, U2 arg2, U3 arg3, U4 arg4) { }
public void Execute<U1, U2, U3, U4, U5>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5) { }
public void Execute<U1, U2, U3, U4, U5, U6>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6)
{ action((T1)(object)(arg1), (T2)(object)arg2, (T3)(object)arg3, (T4)(object)arg4, (T5)(object)arg5, (T6)(object)arg6); }
public void Execute<U1, U2, U3, U4, U5, U6, U7>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6, U7 arg7) { }
} public class GAction<T1, T2, T3, T4, T5, T6, T7> : IGAction
{
Action<T1, T2, T3, T4, T5, T6, T7> action = null;
public GAction(Action<T1, T2, T3, T4, T5, T6, T7> action_) { action = action_; } public void Execute() { }
public void Execute<U1>(U1 arg1) { }
public void Execute<U1, U2>(U1 arg1, U2 arg2) { }
public void Execute<U1, U2, U3>(U1 arg1, U2 arg2, U3 arg3) { }
public void Execute<U1, U2, U3, U4>(U1 arg1, U2 arg2, U3 arg3, U4 arg4) { }
public void Execute<U1, U2, U3, U4, U5>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5) { }
public void Execute<U1, U2, U3, U4, U5, U6>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6) { }
public void Execute<U1, U2, U3, U4, U5, U6, U7>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6, U7 arg7)
{ action((T1)(object)(arg1), (T2)(object)arg2, (T3)(object)arg3, (T4)(object)arg4, (T5)(object)arg5, (T6)(object)arg6, (T7)(object)arg7); }
}
#endregion public class EventListener
{
List<IGAction> reactions = null;
EventRouter router = null; public EventListener(EventRouter er) { router = er; }
public void DetachEvents()
{
if (reactions == null || router == null)
return; foreach(IGAction reaction in reactions)
{ router.RemoveReaction(reaction); }
} #region //listen event
protected void ListenEvent(string sevent, Action cb) {
IGAction igaction = new GAction(cb);
AddReaction(sevent, igaction);
}
protected void ListenEvent<T1>(string sevent, Action<T1> cb) {
IGAction igaction = new GAction<T1>(cb);
AddReaction(sevent, igaction);
}
protected void ListenEvent<T1, T2>(string sevent, Action<T1, T2> cb) {
IGAction igaction = new GAction<T1, T2>(cb);
AddReaction(sevent, igaction);
}
protected void ListenEvent<T1, T2, T3>(string sevent, Action<T1, T2, T3> cb) {
IGAction igaction = new GAction<T1, T2, T3>(cb);
AddReaction(sevent, igaction);
}
protected void ListenEvent<T1, T2, T3, T4>(string sevent, Action<T1, T2, T3, T4> cb) {
IGAction igaction = new GAction<T1, T2, T3, T4>(cb);
AddReaction(sevent, igaction);
}
protected void ListenEvent<T1, T2, T3, T4, T5>(string sevent, Action<T1, T2, T3, T4, T5> cb) {
IGAction igaction = new GAction<T1, T2, T3, T4, T5>(cb);
AddReaction(sevent, igaction);
}
protected void ListenEvent<T1, T2, T3, T4, T5, T6>(string sevent, Action<T1, T2, T3, T4, T5, T6> cb) {
IGAction igaction = new GAction<T1, T2, T3, T4, T5, T6>(cb);
AddReaction(sevent, igaction);
}
protected void ListenEvent<T1, T2, T3, T4, T5, T6, T7>(string sevent, Action<T1, T2, T3, T4, T5, T6, T7> cb) {
IGAction igaction = new GAction<T1, T2, T3, T4, T5, T6, T7>(cb);
AddReaction(sevent, igaction);
}
#endregion private void AddReaction(string sevent, IGAction reaction_)
{
if (router == null) return;
router.AddReaction(sevent, reaction_);
if (reactions == null) reactions = new List<IGAction>();
reactions.Add(reaction_);
}
} public class EventRouter
{
Dictionary<string, List<IGAction>> containers = new Dictionary<string, List<IGAction>>(); public void AddReaction(string sevent, IGAction reaction)
{
List<IGAction> reactionlist = GetReactionList(sevent);
if (reactionlist == null)
{
reactionlist = new List<IGAction>();
containers.Add(sevent, reactionlist);
}
IGAction old = reactionlist.Find(x => x == reaction);
if(old == null) reactionlist.Add(reaction);
} public void RemoveReaction(IGAction reaction)
{
foreach(KeyValuePair<string, List<IGAction>> kv in containers)
{
IGAction old = kv.Value.Find(x => x == reaction);
if (old != null)
{
kv.Value.Remove(old);
break;
}
}
} public List<IGAction> GetReactionList(string sevent)
{
List<IGAction> reactionlist = null;
containers.TryGetValue(sevent, out reactionlist);
return reactionlist;
} #region // send event
public void SendEvent(string sevent)
{
List<IGAction> reactionlist = GetReactionList(sevent);
if (reactionlist == null) return;
foreach (IGAction el in reactionlist)
{
el.Execute();
}
}
public void SendEvent<T1>(string sevent, T1 arg1)
{
List<IGAction> reactionlist = GetReactionList(sevent);
if (reactionlist == null) return;
foreach (IGAction el in reactionlist)
{
el.Execute(arg1);
}
}
public void SendEvent<T1, T2>(string sevent, T1 arg1, T2 arg2)
{
List<IGAction> reactionlist = GetReactionList(sevent);
if (reactionlist == null) return;
foreach (IGAction el in reactionlist)
{
el.Execute(arg1, arg2);
}
}
public void SendEvent<T1, T2, T3>(string sevent, T1 arg1, T2 arg2, T3 arg3)
{
List<IGAction> reactionlist = GetReactionList(sevent);
if (reactionlist == null) return;
foreach (IGAction el in reactionlist)
{
el.Execute(arg1, arg2, arg3);
}
}
public void SendEvent<T1, T2, T3, T4>(string sevent, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
{
List<IGAction> reactionlist = GetReactionList(sevent);
if (reactionlist == null) return;
foreach (IGAction el in reactionlist)
{
el.Execute(arg1, arg2, arg3, arg4);
}
}
public void SendEvent<T1, T2, T3, T4, T5>(string sevent, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5)
{
List<IGAction> reactionlist = GetReactionList(sevent);
if (reactionlist == null) return;
foreach (IGAction el in reactionlist)
{
el.Execute(arg1, arg2, arg3, arg4, arg5);
}
}
public void SendEvent<T1, T2, T3, T4, T5, T6>(string sevent, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6)
{
List<IGAction> reactionlist = GetReactionList(sevent);
if (reactionlist == null) return;
foreach (IGAction el in reactionlist)
{
el.Execute(arg1, arg2, arg3, arg4, arg5, arg6);
}
}
public void SendEvent<T1, T2, T3, T4, T5, T6, T7>(string sevent, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7)
{
List<IGAction> reactionlist = GetReactionList(sevent);
if (reactionlist == null) return;
foreach (IGAction el in reactionlist)
{
el.Execute(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
}
} #endregion
}
}

使用

public class MyUI : RouteSystem.EventListener
{
void nothing() { /*Console.WriteLine("nothing");*/ }
void sayhi(string h) { /*Console.WriteLine("sayhi");*/ }
void run(int a) { /*Console.WriteLine("run");*/ }
void jump(int a, int r) { /*Console.WriteLine("jump");*/ }
void mix(int a, int b, char s, float c, float d) { /*Console.WriteLine("mix");*/ } public MyUI(RouteSystem.EventRouter er):base(er)
{
ListenEvent("nothing", nothing);
ListenEvent<string>("sayhi", sayhi);
ListenEvent<int>("run", run);
ListenEvent<int, int>("jump", jump);
ListenEvent<int, int, char, float, float>("mix", mix);
}
} class Program
{ static void Main(string[] args)
{
RouteSystem.EventRouter er = new RouteSystem.EventRouter();
for (int i = ; i < ; i++)
{
MyUI el = new MyUI(er);
} long x = System.DateTime.Now.Ticks;
for (int i = ; i < ; i++)
{
int a = ;
int b = ;
char c = 'a';
float d = 0f;
float e = 1f;
er.SendEvent("run", a);
}
x = System.DateTime.Now.Ticks - x;
Console.WriteLine("cost " + x.ToString());
} }

c# 事件路由器的更多相关文章

  1. 戏说领域驱动设计(廿七)——Saga设计模型

    上一节我们讲解了常用的事务,也提及了Saga,这是在分布式环境下被经常使用的一种处理复杂业务和分布式事务的设计模式.本章我们的主要目标是编写一个简单版本的Saga处理器,不同于Seata框架中那种可独 ...

  2. JNI详解---从不懂到理解

    转载:https://blog.csdn.net/hui12581/article/details/44832651 Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 C ...

  3. 安天透过北美DDoS事件解读IoT设备安全——Mirai的主要感染对象是linux物联网设备,包括:路由器、网络摄像头、DVR设备,入侵主要通过telnet端口进行流行密码档暴力破解,或默认密码登陆,下载DDoS功能的bot,运行控制物联网设备

    安天透过北美DDoS事件解读IoT设备安全 安天安全研究与应急处理中心(安天CERT)在北京时间10月22日下午启动高等级分析流程,针对美国东海岸DNS服务商Dyn遭遇DDoS攻击事件进行了跟进分析. ...

  4. openwrt-智能路由器hack技术(1)---"DNS劫持"

    openwrt-智能路由器hack技术(1)---"DNS劫持" 1   导读 PS:之前写的一个文章,现在发现结构内容排版不是太好,导致阅读体验太差,影响传播和SEO,所以现在整 ...

  5. 自己动手写客户端UI库——事件机制(设计思路大放送)

    在上一篇文章中我们创建了一个Button控件,并把这个控件显示在界面上, 在这一篇文章中,我们将为这个控件增加一个事件和一个方法 一:怎么绑定事件的问题 在Winform中,我们对一个按钮绑定事件的方 ...

  6. zendframework 事件管理(二)

    首先需要明确的几个问题: Q1.什么是事件? A:事件就是一个有名字的行为.当这个行为发生的时候,称这个事件被触发. Q2.监听器又是什么? A:监听器决定了事件的逻辑表达,由事件触发.监听器和事件往 ...

  7. Zend-MVC事件

    Zend\Mvc\MvcEvent继承自Zend\EventManager\Event,在Zend\Mvc\Application::bootstrap()执行时触发.如果你的控制器实现了Zend\M ...

  8. 2017年开年的第一次比较大的安全事件: MongoDB “赎金事件”,如何看待互联网安全问题

    今天上午(2017年1月7日),我的微信群中同时出现了两个MongoDB被黑掉要赎金的情况,于是在调查过程中,发现了这个事件.这个事件应该是2017年开年的第一次比较大的安全事件吧,发现国内居然没有什 ...

  9. 读取cc2530节点的设备类型、协调器、路由器、终端。

    建立网络.加入网络流程分析 协调器节点:在1-10  实验8 网络通信实验2 组播通信中 while(MSGpkt) { switch(MSGpkt->hdr.event) { case ZDO ...

随机推荐

  1. Python面试题解答

    1. 一个谜题 >>> t = (1, 2, [30, 40]) >>> t[2] += [50, 60] 到底会发生下面 4 种情况中的哪一种? a. t变成(1 ...

  2. sort()没有返回值

    aList = [1,3,5,2,4] aList = aList.sort() print(aList) None

  3. React Native学习(一)——搭建开发环境

    第一次接触React Native,首先搭建环境,过程还算顺利,不过也遇到了些问题,这里简单记录下来.中文官网(http://reactnative.cn/docs/0.47/getting-star ...

  4. js和native交互方法浅析

    一.背景 最近接触公司项目,需要和原生app做交互,由此业务需求,开始了学习探索之路. 二.解决方案之WebViewJavascriptBridge 想要和app交互,必须在app上先把bridge进 ...

  5. 大数据Hadoop学习之搭建hadoop平台(2.2)

    关于大数据,一看就懂,一懂就懵. 一.概述 本文介绍如何搭建hadoop分布式集群环境,前面文章已经介绍了如何搭建hadoop单机环境和伪分布式环境,如需要,请参看:大数据Hadoop学习之搭建had ...

  6. python学习之总结

    迭代器: def gen(): a = 100 yield a a = a * 8 yield a yield 1000 for i in gen(): print(i) 创建一个函数,循环体,yie ...

  7. Linux编译安装Mariadb数据库

    一.安装cmake cd /usr/local/src tar zxvf cmake-2.8.12.1.tar.gz cd cmake-2.8.12.1 ./configure 注意报错需要安装gcc ...

  8. 使用parcel打造一个零配置的react工作流

    parcel是一个前端打包工具.因其推崇的零配置理念,和webpack形成了鲜明对比.对于我这样一个被后端IDE智能提示宠坏的猿,自然是对webpack提不起爱.平时也都是使用CLI默认配置好webp ...

  9. 关于layer的坑

    真是自己给自己挖坑,坑死人不偿命啊. 在用layui开发时,遇到这种情况,点击按钮出现一个弹出层,然而我不是用button按钮去实现的,而是用a标签做的,本来a标签也是可以实现的,在这里我无形中给自己 ...

  10. 如何用SVN版本控制器将提交的文件还原到以前的版本

    工具/原料 SVN乌龟软件和相关的文件 方法/步骤 在相关的文件中右击鼠标,按右图进行选择 在弹出框的地方点击我标记的地方,查看下曾经提交过的版本文件 在弹出框的地方,上面就是有版本号,下面就是我们文 ...