2011-12-29 12 views
0

C#が例えば、great lengths to ensure that you cannot "fire" an eventに行ってきました。:C#:オブジェクトの外部からのイベントを発生させる目的は何ですか?

form.FormClosed(this, new FormClosedEventArgs(CloseReason.UserClosing)); 

button.Click(this, new EventArgs()); 

customer.AddressChanged(this, new EventArgs()); 

を使用すると、イベントをこのように発射することができないため、コンパイルされません。

これは、言語設計者の意識的な決定だったようです。彼らは意図的に "悪い行為"を防止しようとしているようです。

私はの代わりにを見つけようとしています。

実践例:

void ShowPopup(Form form) 
{ 
    ToolStripDropDown toolDrop = new ToolStripDropDown(); 
    ToolStripControlHost toolHost = new ToolStripControlHost(form); 
    toolHost.Margin = new Padding(0); 
    toolDrop.Padding = new Padding(0); 
    toolDrop.Items.Add(toolHost); 

    toolDrop.Closed += toolDrop_Closed; 
    toolDrop.Show(screenLocation); 
} 

void toolDrop_Closed(object sender, ToolStripDropDownClosedEventArgs e) 
{ 
    //The form's FormClosed event doesn't fire when shown as a popup 
    //Fire the event manually 
    form.FormClosed(this, new FormClosedEventArgs(CloseReason.UserClosing)); 
} 

私はいないよ場合は、オブジェクトの外部からのイベントを発射するをはず - それを置き換えるためにを意図技術は何ですか?イベントを発射するための意図代替がない場合


、私はこの状況をどのように処理するかを説明し任意の記事、書籍、またはチャンネル9のビデオはありますか?通常

public class Foo { 
    public event FooDelegate FooEvent; 

    public void RaiseFoo() { 
    if (FooEvent != null) FooEvent(); 
    }  
} 

イベントが、このような公共の「トリガー」を行方不明であれば、それは:

+0

これは何の関係もないと思います。 NET、それ自体。代わりにオブジェクトのメンバのアクセシビリティの関数です。 –

答えて

4

クラス内のイベント、多くの場合、クラスの外からイベントを呼び出すために、クラスのクライアントで使用されるパブリックメソッドを持っています何らかの理由で外部からイベントを呼び出すことができないようにすべきであることを意味します。

あなたの例では、イベントはもちろん

form.Close(); 

とを上昇させることができるが、離れて他のものから、またイベントを発生させます。

+0

問題は、目的のイベントをスローするために使用できるパブリックメソッドを持たないクラスから発生します。 –

+1

これは、クラスが内部的にイベントを発生させることを意味し、おそらく外部から行うべきではありません。確かに、私的な方法のように、あなたは反射によってこれを行うことができますが、それは誰かの意図に反するものです。 Win32メッセージからイベントを取得します。これは、ループによってキャッチされたメッセージの結果として、メッセージループ内から内部的に発生します。イベントの本当の原因(メッセージ)が起こらなかった場合、あなた自身でそのようなイベントを起こす理由は何でしょうか? –

関連する問題