2017-03-08 13 views
1

私は他のイベントにイベントを渡したいが、今はそれを行うために関数を使う。他のイベントにイベントを渡す方法

C#はb.WriteEvent + = a.WriteEventのようなイベントを渡すことができますか?

私はたくさんのクラスを持っていて、上のクラスに引数を渡したいのですが。

私は次のように書いて欲しい。a.event + = b.event。 b.event + = c.event

ロットの代わりに使用方法。

ありがとうございました。

class Program 
{ 
    static void Main(string[] args) 
    { 
     ClassA a = new ClassA(); 
     ClassB b = new ClassB(); 
     a.WriteEvent += MainWrite; 
     b.WriteEvent += a.WireFunction; // Now I use 
     //b.WriteEvent += a.WriteEvent; <= Can I use like this ? 
     b.WireFunction("some str"); 
     Console.ReadLine(); 
    } 

    static void MainWrite(string str) 
    { 
     Console.WriteLine(str); 
    } 
} 

class ClassA 
{ 
    public event Handler WriteEvent; 
    public void WireFunction(string str) 
    { 
     WriteEvent(str); 
    } 
} 

class ClassB 
{ 
    public event Handler WriteEvent; 
    public void WireFunction(string str) 
    { 
     WriteEvent(str); 
    } 
} 

public delegate void Handler(string str); 
+0

複数のイベントに対して同じイベントハンドラを使うことができます: 'b.WriteEvent + = MainWrite;' –

+0

いいえあなたがなぜ尋ねているのか分かりません。コンパイラはエラーメッセージを出します。メッセージは明確ではありませんか?また、なぜあなたはこれを試していますか? – jeroenh

+0

理由は私のMainClassはClassBを呼び出せません。ありがとう –

答えて

0

事実:
あなたがイベントをサブスクライブイベントを提供することはできません。

すべての代理人(イベント、アクション、または機能)は、C#でマルチキャスト代理人です。 これは、イベントに複数回購読できることを意味します。 イベントに登録するには、アクションまたは機能を提供する必要があります。 (私はラムダを提供する可能性があるので、メソッドの代わりに関数という用語を使用します)

以下は、Event1のすべてのサブスクライバにサブスクライブするスナップです。
私はこれがあなたがするつもりであると信じています。

public class SomeClass 
{ 
    public event EventHandler Event1; 
    public event EventHandler Event2; 

    public SomeClass() 
    { 
     Event1 += Subscriber1; 
     Event1 += Subscriber2; 

     var subscribers = Event1.GetInvocationList(); 

     if(subscribers != null) 
     { 
     foreach(var subscriber in subscribers) 
     { 
      EventHandler realSubscriber = (EventHandler)subscriber; 
      Event2 += realSubscriber; 
     } 
     } 

     Event1(this, EventArgs.Empty); 
     Event2(this, EventArgs.Empty); 
    } 

    public void Subscriber1(object sender, EventArgs e) 
    { 
     Console.WriteLine("Subscriber 1 invoked"); 
    } 

    public void Subscriber2(object sender, EventArgs e) 
    { 
     Console.WriteLine("Subscriber 2 invoked"); 
    } 
} 

印刷する工assのインスタンスを作成する:
サブスクライバ1
サブスクライバ2はサブスクライバ1は
サブスクライバ2
を起動起動
呼び出さ呼び出さ

編集:私は移動しようとした
論理を拡張方法に、また通常の実用的な方法に変換する。サブスクライバがいない場合、イベントはnullであるため、どちらもうまく機能しませんでした。サブスクライバなしでイベントを渡すと、nullが渡された場合と同じ動作になります。今のところ、これは私が考え出すことができる最高のものです。

関連する問題