2016-10-28 8 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は、作成したイベント引数クラスの名前です。例えば

:あなたはどこにでもそれを発射していないBecouse

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); 
     } 
    } 
} 
関連する問題