我正在练习事件,但是这段代码给了我错误“错误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");
}
}
答案 0 :(得分:1)
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;
答案 1 :(得分:0)
您通常不需要为事件创建自己的委托。您可以使用内置的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
是您创建的事件args类的名称。
例如:
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);
}
}
}