如何在 C # 中创建自己的事件?

如何在 C # 中创建自己的事件?

134574 次浏览

可以使用以下代码声明事件:

public event EventHandler MyOwnEvent;

如果需要,可以使用自定义委托类型而不是 EventHandler。

您可以在文章 事件教程(MSDN)中找到有关在.NET 中使用事件的详细信息/教程。

我有一个充分的讨论事件和代表在我的 活动文章。对于最简单的事件类型,只需声明一个公共事件,编译器就会创建一个事件和一个字段来跟踪订阅者:

public event EventHandler Foo;

如果需要更复杂的订阅/取消订阅逻辑,可以明确地这样做:

public event EventHandler Foo
{
add
{
// Subscription logic here
}
remove
{
// Unsubscription logic here
}
}

下面是一个用 C # 创建和使用事件的例子

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();
}
}
}

要做到这一点,我们必须知道三个组成部分

  1. 负责 firing the Event的地方
  2. 负责 responding to the Event的地方
  3. 事件本身

    事件

    EventArgs

    EventArgs 枚举

现在允许创建在调用函数时触发的 Event

但我解决这个问题的顺序是这样的: 在创建类之前使用它

  1. 负责 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 is a static class I will Explain it later

the next step is

  1. the place responsible for 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));
    

the third step

  1. the Event itself

I warped The Event within a class called 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 EventEventArgsEventArgs Enums以及 the function

抱歉回答得这么长