为什么这个事件没有被触发

本文关键字:事件 为什么 | 更新日期: 2023-09-27 18:15:31

我正在练习事件,但这段代码给了我错误"错误1名称'Productfinished'不存在于当前上下文中"。我只是想触发事件并打印消息,但是有些地方出错了。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Event2_2
{
    class Product
    {
        public delegate void ProductFinishedEventHandler();
        public event ProductFinishedEventHandler Productfinished;        
    }
    class Program
    {
        static void Main(string[] args)
        {
            Product pd = new Product();
            pd.Productfinished += new Product.ProductFinishedEventHandler(SendMail);
            Productfinished();
}
    }
    public static void SendMail()
    {
        Console.WriteLine("Mail sent to Vendor");
    }
}

为什么这个事件没有被触发

Productfinished不是Program的成员,它是Product的成员,这就是为什么你会得到错误。

要引发事件,您需要向Product类添加一个方法来触发事件。例如:

void OnProductFinished()
{
  var handler = ProductFinished();
  if(handler != null)
  {
    handler();
  }
}

注意,在触发事件之前,您需要检查是否有分配给该事件的处理程序。如果没有,则事件为空。

同样,遵循。net事件模式是值得的。最简单的方法是使用EventHandler<>委托:

public event EventHandler<EventArgs> Productfinished;

现在触发事件,你说:

void OnProductFinished()
{
  var handler = ProductFinished();
  if(handler != null)
  {
    handler(this, EventArgs.Empty);
  }
}

然后将SendMail方法声明为

public static void SendMail(object sender, EventArgs args)
{
    Console.WriteLine("Mail sent to Vendor");
}

您可以很容易地附加事件处理程序,只需输入:

pd.Productfinished += SendMail;

您通常不需要为事件创建自己的委托。您可以使用内置的EventArgs委托,如下所示:

using System;
namespace Event2_2
{
    class Product
    {
        public void OnSendMail()
        {
            Productfinished?.Invoke(this, new EventArgs());
        }
        public event EventHandler<EventArgs> Productfinished;
    }
    class Program
    {
        static void Main(string[] args)
        {
            Product pd = new Product();
            pd.Productfinished += SendMail;
            pd.OnSendMail();
        }
        public static void SendMail(object sender, EventArgs eventArgs)
        {
            Console.WriteLine("Mail sent to Vendor");
        }
    }
}

如果你想传递参数给你的事件处理程序,创建一个从EventArgs派生的类(惯例是它的名字以EventArgs结尾),并用它来封装参数。

然后将事件声明为EventHandler<T>类型,其中T是您创建的事件参数类的名称。

例如:

using System;
namespace Event2_2
{
    public sealed class SendMailEventArgs : EventArgs
    {
        public SendMailEventArgs(string recipient)
        {
            Recipient = recipient;
        }
        public string Recipient { get; }
    }
    class Product
    {
        public void OnSendMail(string recipient)
        {
            Productfinished?.Invoke(this, new SendMailEventArgs(recipient));
        }
        public event EventHandler<SendMailEventArgs> Productfinished;
    }
    class Program
    {
        static void Main(string[] args)
        {
            Product pd = new Product();
            pd.Productfinished += SendMail;
            pd.OnSendMail("Test Recipient");
        }
        public static void SendMail(object sender, SendMailEventArgs eventArgs)
        {
            Console.WriteLine("Mail sent to recipient: " + eventArgs.Recipient);
        }
    }
}