声明事件
首先我们需要声明事件,也就是创造事件。
public event EventHandler RaiseCustomEvent;
public event CustomEventHandler RaiseCustomEvent;
public event EventHandler<CustomEventArgs> RaiseCustomEvent;
解释(有三种方法):
- 如果没有任何自定义 EventArgs 类,事件类型将为非泛型 EventHandler 委托;
- 使用非泛型版本 EventHandler
并且具有派生自 EventArgs 的自定义类,请声明发布类中的事件; - 如果使用泛型版本,则无需自定义委托;
例子
public event EventHandler<CustomEventArgs> RaiseCustomEvent;
这句话相当于:
public delegate void CustomEventHandler( object sender, CustomEventArgs e );
public event CustomEventHandler RaiseCustomEvent;
public class CustomEventArgs : EventArgs
{
public CustomEventArgs(string s)
{
message = s;
}
private string message;
public string Message
{
get { return message; }
set { message = value; }
}
}
注册事件
然后某些地方可能会需要把自己的响应函数或者其它给注册都对应事件中去。
注册事件时,我们需要获取到我们之前创造的事件,我们可以为事件系统写一个全局的静态函数来操作,也可以通过对象来操作,我的想法是可以创造一个单例。
注册:
RaiseCustomEvent += HandleCustomEvent;
这里的HandleCustomEvent必须对应为我们之前创造(声明)事件时的委托或者是lambda表达式。
比如:
void HandleCustomEvent(object sender, CustomEventArgs e)
{
Console.WriteLine(" received this message: {0}", e.Message);
}
因为我们前面是写的CustomEventArgs, 所以我们的响应函数,或者叫回调函数的类型就得是委托类型。
事件的调用
参数:
CustomEventArgs e
调用:
RaiseCustomEvent( this(对象) , e);
这里的this指触发事件的对象,比如上面的sender。比如我们的一个按钮被点击了,这个按钮就是这个对象,然后我们的事件参数e里面可以包含一些我们想要的信息,比如打开,关闭等命令。然后对应的接收方收到消息后,就会调用自己的回调函数,比如关闭自己的什么东西,打开什么东西。
例子
先自定义事件和委托
public class MyGameEventArgs : EventArgs
{
public int num;
}
public delegate void MyHandler<T>(T i);
public static event MyHandler<MyGameEventArgs> HandEvent;
不同方法达到相同的目的:
- Delegate
MyHandler<int> myHandler = new MyHandler<int>(CallBack);
myHandler += CallBack2;
myHandler += CallBack3;
myHandler?.Invoke(666);
- Event
使用C#的event关键字定义的HandEvent
也声明了T的类型是MyGameEventArgs,其实与
代理实例在定义时相似,这里的申明类型是int
HandEvent += EventCallBack;
HandEvent += EventCallBack2;
HandEvent += EventCallBack3;
HandEvent?.Invoke(new MyGameEventArgs() { num = 999});
public static void EventCallBack(MyGameEventArgs num)
{
Console.WriteLine(num.num);
}public static void EventCallBack2(MyGameEventArgs num)
{
Console.WriteLine(num.num+1);
}public static void EventCallBack3(MyGameEventArgs num)
{
Console.WriteLine(num.num+2);
}
public static void CallBack(int num)
{
Console.WriteLine(num);
}
public static void CallBack2(int num)
{
Console.WriteLine(num+1);
}
public static void CallBack3(int num)
{
Console.WriteLine(num + 2);
}