2016-10-28 4 views
0

이벤트를 연습하고 있지만이 코드에서 "오류 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

당신은 어디를 발생하지 않는 렸기 때문에. – user1681317

+0

이 질문의 제목이 잘못되었습니다. 문제가 컴파일러 오류 인 경우 "왜 코드가 이와 같이 작동합니까?"라고 묻지 마십시오. –

+0

Productfinished(); 이 사건을 해고하지 않니? – Lyrk

답변

1

Productfinished 당신이 오류를 받고있어 그 이유는, 그것이 Product의 일원이다, Program의 구성원이 아닙니다.

이벤트를 발생 시키려면 이벤트를 발생시키기 위해 Product 클래스에 메소드를 추가해야합니다. 예 :

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

이벤트를 시작하기 전에 이벤트에 할당 된 처리기가 있는지 확인해야합니다. 이벤트가 없으면 null이됩니다.

또한 .Net 이벤트 패턴을 따르는 것이 좋습니다.

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

당신은 다음

public static void SendMail(object sender, EventArgs args) 
{ 
    Console.WriteLine("Mail sent to Vendor"); 
} 
당신에게 SendMail 방법을 선언 할 것 : 당신이 말하는 이벤트를 높이기 위해 지금

public event EventHandler<EventArgs> Productfinished; 

그리고 이렇게하는 가장 쉬운 방법은 EventHandler<> 대리자를 사용하는 것입니다

다음과 같이 이벤트 처리기를 쉽게 연결할 수 있습니다.

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은 작성한 이벤트 인수 클래스의 이름입니다. 예를 들어

:

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); 
     } 
    } 
} 
관련 문제