2016-10-28 3 views
0

Я занимаюсь событиями, но этот код дает мне ошибку «Ошибка 1 Название« Продукт »не существует в текущем контексте». Я просто хочу запустить событие и распечатать сообщение, но что-то не так.Почему это событие не было выпущено?

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

Becouse вы не стрелять в любом месте. – user1681317

+0

Название этого вопроса неверно. Не спрашивайте «почему код ведет себя так», если проблема - ошибка компилятора. –

+0

Productfinished(); разве это не увольнение? – Lyrk

ответ

1

Productfinished не является членом Program, он является членом Product, поэтому вы получаете сообщение об ошибке.

Чтобы создать событие, необходимо добавить метод к классу Product, чтобы запустить событие. Например:

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

Обратите внимание, что перед тем, как запустить его, необходимо проверить, что перед ним назначены обработчики. Это не так, тогда событие равно null.

Кроме того, он платит за шаблон .Net event. Самый простой способ сделать это состоит в использовании 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; 
+0

Кроме того, если он использует последнюю версию C#, он может просто пойти 'handler? .Invoke()' :) –

+0

@ Moo-Juice - да, но если он не тот, он не может ... – Sean

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); 
     } 
    } 
} 
Смежные вопросы