为什么这个事件没有被触发
本文关键字:事件 为什么 | 更新日期: 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);
}
}
}