事件接受与发送是通过 委托来实现的,随意,在学习事件之前一定要知道委托。
首先我们先看下图:上的图不完整人,但大概是这个意思。
我们要创建一个事件管理。 来处理发布者发送消息和订阅者的接受消息中间转接。
然后订阅者去创建监听消息,然后,发布者再去触发事件。事件管理就会向所有监听该事件的订阅者去发布消息。当订阅者监听到消息后,会对其做一些相关的操作。大概就是这么个意思。
然后,我们开始写代码吧。首先,我们要去创建事件管理,其实就是一个委托,但创建的时候需要添加 关键字 event。
public delegate void EventManager();
class EventClass
{private static EventClass _instance;public static EventClass Instance{get{if (_instance == null)_instance = new EventClass();return _instance;}}// 创建一个事件管理对象private event EventManager eventManager;public void AddEventListener(EventManager arge){eventManager += arge;}public void RemoveEventListener(EventManager arge){eventManager -= arge;}public void DispatchEvent(){eventManager();}
}
我们创建了一个委托类型 EventManager 然后在 EventClass 类中创建了 添加 事件的方法 AddEventListener 移除监听事件 RemoveEventListener 和 分发事件 DispatchEvent
。当订阅者监听是后,就会去调用 AddEventListener 函数如下:
class EventClass1
{public void PrintLog(){Console.WriteLine("EventClass1__PrintLog");}
}EventClass1 event1 = new EventClass1();
EventClass.Instance.AddEventListener(event1.PrintLog);
这个时候,委托变量 eventManager 就会记录 event1 对象中的 PrintLog 函数正在监听着事件。当其他函数去执行 DispatchEvent 分发事件函数时,eventManager 会调用每一个监听事件函数。完整代码如下:
public delegate void EventManager();class EventClass{private static EventClass _instance;public static EventClass Instance{get{if (_instance == null) _instance = new EventClass();return _instance;}}// 创建一个事件管理对象private event EventManager eventManager;public void AddEventListener(EventManager arge){eventManager += arge;}public void RemoveEventListener(EventManager arge){eventManager -= arge;}public void DispatchEvent(){eventManager();}}class EventClass1 {public void PrintLog(){Console.WriteLine("EventClass1__PrintLog");}}class EventClass2{public void PrintLog2(){Console.WriteLine("EventClass2_PrintLog2");}}class Program{static void Main(string[] args){EventClass1 event1 = new EventClass1();EventClass2 event2 = new EventClass2();EventClass.Instance.AddEventListener(event1.PrintLog);EventClass.Instance.AddEventListener(event2.PrintLog2);// 调用分发事件函数EventClass.Instance.DispatchEvent();Console.ReadKey();}}
运行结果如下:
EventClass1__PrintLog
EventClass2_PrintLog2
在这里创建事件委托的还可以使用 event 关键字简化
public event EventManager eventManager;// 创建一个事件管理对象//private EventManager eventManager;//public void AddEventListener(EventManager arge)//{// eventManager += arge;//}//public void RemoveEventListener(EventManager arge)//{// eventManager -= arge;//}
这样的话,就可以直接 使用 “+=” 方式来进行监听事件
EventClass.Instance.eventManager += event1.PrintLog;
EventClass.Instance.eventManager += event2.PrintLog2;
看完整的代码
public delegate void EventManager();
class EventClass
{private static EventClass _instance;public static EventClass Instance{get{if (_instance == null) _instance = new EventClass();return _instance;}}public event EventManager eventManager;public void DispatchEvent(){eventManager();}
}class EventClass1
{public void PrintLog(){Console.WriteLine("EventClass1__PrintLog");}
}class EventClass2
{public void PrintLog2(){Console.WriteLine("EventClass2_PrintLog2");}
}class Program
{static void Main(string[] args){EventClass1 event1 = new EventClass1();EventClass2 event2 = new EventClass2();EventClass.Instance.eventManager += event1.PrintLog;EventClass.Instance.eventManager += event2.PrintLog2;// 调用分发事件函数EventClass.Instance.DispatchEvent();Console.ReadKey();}
}
其实系统有给我们创建通用的事件委托 EventHandler,这样的话,我们就不需要自己定义委托了。直接可以使用通用委托来定义。在我们传递监听参数时就需要传递参数,带上两个参数。object 和 EventArgs 而输出的时候,也需要带上参数第一个就是委托所在类本身,第二个没有参数,可以传 null
public event EventHandler eventManager;
//public void PrintLog()//{// Console.WriteLine("EventClass1__PrintLog");//}public void PrintLog(object source, EventArgs e){Console.WriteLine("EventClass1__PrintLog");}
```csharp
public void DispatchEvent()
{if (eventManager != null)eventManager(this, null);}
其他的基本上不用变化。输出还是一样的。
在使用通用委托时,有两个参数,其中 EventArgs 是可以传递参数的,但是要传递参数的话,必须继承 EventArgs 类来储存内容才能使用。而我们的委托也要用泛型委托。具体看下面代码:
public class EventArgsTest : EventArgs
{public int TestNum { get; set; }}class EventClass{private static EventClass _instance;public static EventClass Instance{get{if (_instance == null)_instance = new EventClass();return _instance;}}public event EventHandler<EventArgsTest> eventManager;public void DispatchEvent(){EventArgsTest e = new EventArgsTest();e.TestNum = 10;if (eventManager != null)eventManager(this, e);}}class EventClass1{public void PrintLog(object source, EventArgsTest e){Console.WriteLine("EventClass1__PrintLog = {0}", e.TestNum);}}class EventClass2{public void PrintLog2(object source, EventArgsTest e){Console.WriteLine("EventClass2_PrintLog2 = {0}", e.TestNum);}}class Program{static void Main(string[] args){EventClass1 event1 = new EventClass1();EventClass2 event2 = new EventClass2();EventClass.Instance.eventManager += event1.PrintLog;EventClass.Instance.eventManager += event2.PrintLog2;// 调用分发事件函数EventClass.Instance.DispatchEvent();Console.ReadKey();}}