C#自定义事件

发布时间:2021-09-15编辑:佚名阅读(1692)

简单示例:

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 : 0; }
        }
        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 == 1)
                    OnInput(this, new MyEventArgs(str[0])); //触发事件
                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() + ")");
        }
    }
}

效果:

判断事件是哪个类触发的:

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[9];//声明
            for (int i = 0; i < Evt.Length; i++)
            {
                Evt[i] = new MyEvent();//实例化
                Evt[i].MyID = (i + 1).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; //解绑事件

在事件处理中设置参数,决定是否退出监听输入:

//事件参数定义
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#自定义事件


鼓掌

0

正能量

0

0

呵呵

0


评论区