我怎样才能在C#中创build自己的事件?
我怎样才能在C#中创build自己的事件?
这是一个用C#创build和使用事件的例子
using System; namespace Event_Example { //First we have to define a delegate that acts as a signature for the //function that is ultimately called when the event is triggered. //You will notice that the second parameter is of MyEventArgs type. //This object will contain information about the triggered event. public delegate void MyEventHandler(object source, MyEventArgs e); //This is a class which describes the event to the class that recieves it. //An EventArgs class must always derive from System.EventArgs. public class MyEventArgs : EventArgs { private string EventInfo; public MyEventArgs(string Text) { EventInfo = Text; } public string GetInfo() { return EventInfo; } } //This next class is the one which contains an event and triggers it //once an action is performed. For example, lets trigger this event //once a variable is incremented over a particular value. Notice the //event uses the MyEventHandler delegate to create a signature //for the called function. public class MyClass { public event MyEventHandler OnMaximum; private int i; private int Maximum = 10; public int MyValue { get { return i; } set { if(value <= Maximum) { i = value; } else { //To make sure we only trigger the event if a handler is present //we check the event to make sure it's not null. if(OnMaximum != null) { OnMaximum(this, new MyEventArgs("You've entered " + value.ToString() + ", but the maximum is " + Maximum.ToString())); } } } } } class Program { //This is the actual method that will be assigned to the event handler //within the above class. This is where we perform an action once the //event has been triggered. static void MaximumReached(object source, MyEventArgs e) { Console.WriteLine(e.GetInfo()); } static void Main(string[] args) { //Now lets test the event contained in the above class. MyClass MyObject = new MyClass(); MyObject.OnMaximum += new MyEventHandler(MaximumReached); for(int x = 0; x <= 15; x++) { MyObject.MyValue = x; } Console.ReadLine(); } } }
我在我的活动文章中充分讨论了活动和代表。 对于最简单的事件,您可以声明一个公共事件,编译器将创build一个事件和一个字段来跟踪订阅者:
public event EventHandler Foo;
如果您需要更复杂的订阅/取消订阅逻辑,您可以明确地做到这一点:
public event EventHandler Foo { add { // Subscription logic here } remove { // Unsubscription logic here } }
你可以用下面的代码声明一个事件:
public event EventHandler MyOwnEvent;
如果需要,可以使用自定义的委托types而不是EventHandler。
您可以在MSDN文章中find有关.NET中使用事件的详细信息/教程。
要做到这一点,我们必须知道这三个组成部分
- 负责
firing the Event
的地方 - 负责
responding to the Event
-
事件本身
一个。 事件
b .EventArgs
C。 EventArgs枚举
现在让我们创build一个调用函数时触发的事件
但我解决这个问题的顺序是这样的:我在创build它之前使用这个类
-
负责
responding to the Event
NetLog.OnMessageFired += delegate(object o, MessageEventArgs args) { // when the Event Happened I want to Update the UI // this is WPF Window (WPF Project) this.Dispatcher.Invoke(() => { LabelFileName.Content = args.ItemUri; LabelOperation.Content = args.Operation; LabelStatus.Content = args.Status; }); };
NetLog是一个静态类,我会稍后解释它
下一步是
-
负责
firing the Event
的地方//this is the sender object, MessageEventArgs Is a class I want to create it and Operation and Status are Event enums NetLog.FireMessage(this, new MessageEventArgs("File1.txt", Operation.Download, Status.Started)); downloadFile = service.DownloadFile(item.Uri); NetLog.FireMessage(this, new MessageEventArgs("File1.txt", Operation.Download, Status.Finished));
第三步
- 事件本身
我在一个名为NetLog的课堂上翘曲了事件
public sealed class NetLog { public delegate void MessageEventHandler(object sender, MessageEventArgs args); public static event MessageEventHandler OnMessageFired; public static void FireMessage(Object obj,MessageEventArgs eventArgs) { if (OnMessageFired != null) { OnMessageFired(obj, eventArgs); } } } public class MessageEventArgs : EventArgs { public string ItemUri { get; private set; } public Operation Operation { get; private set; } public Status Status { get; private set; } public MessageEventArgs(string itemUri, Operation operation, Status status) { ItemUri = itemUri; Operation = operation; Status = status; } } public enum Operation { Upload,Download } public enum Status { Started,Finished }
这个类现在包含the Event
, EventArgs
和EventArgs Enums
以及负责触发事件the function
对不起,这个长的答案