我知道你为啥点进来,所以不要犹豫了,立刻马上果断创建控制台项目,直接复制下面精干短小而又强大的代码运行:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestEvent
{
class MyEvent //声明事件
{
public event EventHandler<EventArgs> OnInput; //定义一个委托类型的事件
public void WaitInput()
{
while (true)
{
if (Console.ReadLine() == "x")
OnInput(this, new EventArgs()); //触发事件
}
}
}
class Program
{
static void Main(string[] args)
{
MyEvent Evt = new MyEvent();//实例化
Evt.OnInput += On_Input; //绑定事件到方法
Evt.WaitInput();
}
//事件处理方法
private static void On_Input(object sender, EventArgs e)
{
Console.WriteLine("你触发了‘X’!");
}
}
}

输入'x'回车,看效果:

如果触发事件的时候,想传递点参数怎么办?看来你是一个要求很高的人!请删掉上面的代码,复制下面的进去运行看看:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace TestEvent
{
//事件参数定义
class MyEventArgs : EventArgs
{
char _char;
string _msg;
//事件参数重载
public MyEventArgs(char chr)//当输入内容为字符
{
this._char = chr;
}
public MyEventArgs(string msg)//当输入内容为字符串
{
this._msg = msg;
}
//事件属性
public int Ascii//获取输入的(首字符)ASCII码
{
get { return string.IsNullOrEmpty(_msg) ? (int)_char : ; }
}
public char Char//获取输入的(首)字符
{
get { return string.IsNullOrEmpty(_msg) ? _char : '?'; }
}
public string Msg//获取输入的字符串
{
get { return string.IsNullOrEmpty(_msg) ? "Not String!" : _msg; }
}
}
//事件
class MyEvent
{
public event EventHandler<MyEventArgs> OnInput; //定义一个委托类型的事件
public void WaitInput()
{
while (true)
{
string str = Console.ReadLine();
if (str.Length == )
OnInput(this, new MyEventArgs(str[])); //触发事件
else
OnInput(this, new MyEventArgs(str)); //演示不同的参数类型
}
}
}
class Program
{
static void Main(string[] args)
{
MyEvent Evt = new MyEvent();//实例化
Evt.OnInput += On_Input; //绑定事件,也就是触发的方法
Evt.WaitInput();
}
//事件处理方法
private static void On_Input(object sender, MyEventArgs e)
{
Console.WriteLine("输入的内容: " + e.Msg);
Console.WriteLine("输入的字符: " + e.Char + " (ASCII: " + e.Ascii.ToString() + ")");
}
}
}

效果:

然而还有一些道友有着更高更骚的要求,比如使用了很多的类[n],怎么处理事件,怎么判断事件是哪个类触发的?请看下面通过第一个示例修改后的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestEvent
{
class MyEvent //声明事件
{
public event EventHandler<EventArgs> OnInput; //定义一个委托类型的事件
public string MyID { get; set; }
public void TestInput( string s)
{
if(s==MyID)//如果输入的和自己的ID一样,就触发事件
OnInput(this, new EventArgs());
}
}
class Program
{
static void Main(string[] args)
{ MyEvent[] Evt = new MyEvent[];//声明
for (int i = ; i < Evt.Length; i++)
{
Evt[i] = new MyEvent();//实例化
Evt[i].MyID = (i + ).ToString();//设置ID1~9
Evt[i].OnInput += On_Input; //都绑定事件到同一个方法
}
while (true)//由于是单线程不能每个都循环,输入监视放到这里来,写成多线程代码增多太绕了
{
string s = Console.ReadLine();
foreach (MyEvent me in Evt)
me.TestInput(s);//分别提交测试
}
}
//事件处理方法
private static void On_Input(object sender, EventArgs e)
{
string _id = (sender as MyEvent).MyID;//注意这里
Console.WriteLine("第 " + _id + " 被触发!");
}
}
}

输入数字后回车看效果:

最后还剩一个特别说明,专门为好奇心特别重的朋友准备,上面的代码中,绑定事件为啥写成+=?因为...

Evt.OnInput += On_Input; //绑定事件
Evt.OnInput -= On_Input; //解绑事件

6-18:再补充一个简单的例子,在事件处理中设置参数,决定是否退出监听输入:

//事件参数定义
class MyEventArgs : EventArgs
{
public MyEventArgs(string s) { InputString = s; }
public string InputString { get; private set; }
public bool Cancel { get; set; }
}
//事件
class MyEvent
{
public event EventHandler<MyEventArgs> OnInput; //定义一个委托类型的事件
public void WaitInput()
{
while (true)//监视输入的循环
{
string str = Console.ReadLine();
if (!string.IsNullOrEmpty(str))
{
MyEventArgs myevent = new MyEventArgs(str);
OnInput(this, myevent); //触发事件
if (myevent.Cancel)
{
Console.WriteLine("退出监听!");
break;
}
}
}
}
}
class Program
{
static void Main(string[] args)
{ MyEvent Evt = new MyEvent(); //实例化
Evt.OnInput += On_Input; //绑定事件
Evt.WaitInput(); //监听输入
Evt.OnInput -= On_Input; //解绑事件
Console.ReadLine();
}
//事件处理方法
private static void On_Input(object sender, MyEventArgs e)
{
if (e.InputString == "x")
e.Cancel = true; //设置取消监听
else
Console.WriteLine("您输入了:" + e.InputString);
}
}

效果:

上面的示例修改自网上,机制、原理啥的我也不复制了,太绕了,反正发一大堆文字也没啥人愿意看,还不如简单粗暴直接代码算了。大家都是这么用,无毒无副作用无不良反应。

C#超简单自定义事件的更多相关文章

  1. .net 中 C# 简单自定义事件实现

    个人认为事件处理机制是一种很好的机制 特别是可以方便安全的实现窗口间(子窗口对父窗口,子窗口间等)的消息传递.功能调用 下面展现的源自以前论坛上看到的一套方法,可能记得不大准确,所以可能不规范,我的理 ...

  2. js简单自定义事件与主动触发事件

    var events = { addHandler: function (element, eventType, handler) { if (element.addEventListener) { ...

  3. JavaScript使用自定义事件实现简单的模块化开发

    WEB前端最常见驱动方式就是事件了, 所有交互等等都是通过事件,前端的常见事件有: UI事件: 焦点事件: 鼠标事件: 滚轮事件: 文本事件: 键盘事件: 变动事件: 现在网页上有一个输入框, 如果我 ...

  4. .net自定义事件,经典简单实例代码

    1,新建一个控制台应用程序TestDelegate,本项目主要实现:热水器加热,报警器监控,当热水温度达到80度的时候报警器报警这样一个简单的事件处理程序 2,定义委托处理程序 public dele ...

  5. Abp 领域事件简单实践 <三> 自定义事件

    熵片用到的  EntityCreatedEventData<TEntity>,继承自EventData. 我们可以自定义事件: public class TestEvent: EventD ...

  6. Javascript之自定义事件

    Javascript自定义事件,其本质就是观察者模式(又称订阅/发布模式),它的好处就是将绑定事件和触发事件相互隔离开,并且可以动态的添加.删除事件. 下面通过实例,一步一步构建一个具体的Javasc ...

  7. 跟着《beginning jquery》学写slider插件并借助自定义事件改进它

    <beginning jquery>是一本很不错的学习jquery的书,作者的讲解深入浅出,很适合初学者,在最后一章里面,作者把前面所有的点结合起来完成了一个轮播图的jquery插件.实现 ...

  8. 把C#程序(含多个Dll)合并成一个Exe的超简单方法

    开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了. 但是,很多时候我们本想开发一款只需要一个exe就能完美运行的小工具.那该怎么办呢? 下文介绍一种超 ...

  9. 【2016-11-11】【坚持学习】【Day24】【WPF 自定义控件 附加属性 自定义事件】

    UserControl ,自定义控件. 这里刚刚想到一个问题.什么时候应该用usercontrol 定义一个控件.什么时候应该重写控件的template和样式,实现新效果. 引用一下人家的话:http ...

随机推荐

  1. A Reliability-Aware Network Service Chain Provisioning With Delay Guarantees in NFV-Enabled Enterprise Datacenter Networks

    文章名称:A Reliability-Aware Network Service Chain Provisioning With Delay Guarantees in NFV-Enabled Ent ...

  2. NOI-OJ 2.2 ID:3089 爬楼梯

    整体思路 这是一个典型的递归型问题: 临界点:如果只有1级台阶,有1种走法(一次一步):如果有2级台阶,则有2种走法(一次一步或一次两步) 递归方法,对于n级台阶,如果第一次走1步,还剩n-1级台阶, ...

  3. 第七节:语法总结(1)(自动属性、out参数、对象初始化器、var和dynamic等)

    一. 语法糖简介   语法糖也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方 ...

  4. HTML(六)HTML iframe 使用postMessage方法进行跨文档消息传递

    什么是iframe HTML内联框架元素 <iframe> 表示嵌套的浏览上下文,有效地将另一个HTML页面嵌入到当前页面中. <iframe id="inlineFram ...

  5. JS转换HTML转义符,编码及解码

    JS转换HTML转义符 //去掉html标签 function removeHtmlTab(tab) { return tab.replace(/<[^<>]+?>/g,'') ...

  6. tex中pdf外链

    \documentclass{article} \usepackage{hyperref} \begin{document} \href{run:d:/my folder/test.pdf}{This ...

  7. Unity3D 热更新方案总结

    如何评价腾讯在Unity下的xLua(开源)热更方案? Unity 游戏用XLua的HotFix实现热更原理揭秘 腾讯开源手游热更新方案,Unity3D下的Lua编程 [Unity]基于IL代码注入的 ...

  8. NTFS权限笔记 2017-12-4

    NTFS权限:(文件或文件夹右键属性--安全--ACL) 1.文件系统类型: NTFS:支持单个文件大于4个G,支持文件权限设置 FAT32:不支持单个文件大于4G,不支持文件权限设置 2.取消权限继 ...

  9. Contest2156 - 2019-3-7 高一noip基础知识点 测试2 题解版

    传送门 预计得分:100+70+100+50=320 实际得分100+63+77+30=270 Ctrl_C+Ctrl_V时不要粘贴翻译的,直接粘原文, In a single line of the ...

  10. WPS或xls 数据分列 清洗

    一 .一般分离 时间:2017年11月27日14:55:12 数据如下: 501陈**:田莨铺58 502陈**:田莨铺58 503陈**.六麻杨冲58元 504陈**.石脚哗.200元 505陈** ...