为什么这个事件没有解雇?

时间:2016-10-28 07:56:48

标签: c# events

我正在练习事件,但是这段代码给了我错误“错误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");
    }
}

2 个答案:

答案 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);
        }
    }
}