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

时间:2009-03-08 11:43:25

标签: c# .net events

如何在C#中创建自己的活动?

4 个答案:

答案 0 :(得分:203)

以下是使用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 :(得分:51)

我在events article中对事件和代表进行了全面讨论。对于最简单的事件,您可以声明一个公共事件,编译器将创建一个事件和一个字段来跟踪订阅者:

public event EventHandler Foo;

如果您需要更复杂的订阅/取消订阅逻辑,您可以明确地执行此操作:

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

答案 2 :(得分:20)

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

public event EventHandler MyOwnEvent;

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

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

答案 3 :(得分:4)

要做到这一点我们必须知道三个组件

  1. 负责firing the Event
  2. 的地方
  3. 负责responding to the Event
  4. 的地方
  5. 活动本身

    一个。事件

    b .EventArgs

    ℃。 EventArgs枚举

  6. 现在让我们创建在调用函数时触发的事件

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

    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;
              });
      };
      
    2. NetLog是一个静态类,我将在稍后解释

      下一步是

      1. 负责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));
        
      2. 第三步

        1. 活动本身
        2. 我在名为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负责解雇活动

          抱歉这个很长的答案