2009-08-04 6 views
3
public class a 
{ 
    public event eventhandler test; 
    public void RaiseTest(){//fire test} 
} 

メソッドを呼び出すことなく、このクラスの外部からこのクラスのテストを呼び出すことは可能ですか?カスタム関数を使用せずにオブジェクトの外側からオブジェクトのイベントを発生させることは可能ですか?

基本的には、外部ソースに基づいて発生させる必要があるイベントが多数あり、それぞれに対してRaise()関数を作成する必要はありません。

パラメータとして発生させるイベントを受け入れる一般的なRaise()を作成することはできますか?したがって、それはまだクラス内から呼び出されるでしょうか?

答えて

4

これはReflectionによって実行できますが、それは明らかではありません。 C#でイベントを宣言すると、イベント名+ "イベント"のクラスにフィールドが追加されます。フィールドでGetValueを呼び出すと、MulticastDelegateインスタンスが返されます。

あなたがMulticastDelegateを持っていたら、あなたは呼び出しリストを取得し、順番に各メンバーを呼び出すことができます。

EventArgs e = new EventArgs(myClassInstance); // Create appropriate EventArgs 

MulticastDelegate eventDelagate = 
    this.GetType().GetField(theEventName + "Event", 
    System.Reflection.BindingFlags.Instance | 
    System.Reflection.BindingFlags.NonPublic).GetValue(myClassInstance) as MulticastDelegate; 

Delegate[] delegates = eventDelagate.GetInvocationList(); 
foreach (Delegate del in delegates) { 
     del.Method.Invoke(del.Target, new object[] { myClassInstance, e }); 
} 

注これはインスタンスから非公開フィールドを取得が必要ですので、それが唯一のフルに動作することは、信頼し、非常に限られています。

イベントをパラメータとして生成する一般的なRaise()を作成することはできますか?したがって、それはまだクラス内から呼び出されるでしょうか?

はい。これを行うために上記のコードを変更するのはかなり簡単でしょう。単に "myClassInstance"をこれに置き換えてください。 NonPublic BindingFlagはもはや問題にはならないので、実際には完全信頼で正しく動作することができます。

+0

ジェネリックメソッドは、イベントをプロパティとして渡すことができないという問題を引き起こします。エラーは「左手でのみ発生する必要があります」などです。解決策はイベントキーワードを削除することです。イベントは正常に機能しますが問題なく周りを回ることができ、一般的に提起される。 –

+0

ああ、非常に素晴らしいトリック:)私はXXXEventフィールドについて知りませんでした、私はそれが自動的にコンパイラによって生成されると思いますか? –

+0

トーマス:はい。 @ Gaijin:あなたはなぜプロパティとして渡されるイベントが必要ですか?ここでは、名前でイベントを使用しています... –

2

メソッドを呼び出すことなく、このクラスの外部からこのクラスのテストを呼び出すことはできますか?

短い回答:いいえ。

のみイベントを宣言するクラスは、それ

それがパラメータとして提起するイベントを受け入れる一般的な昇給を()を作成することは可能です引き上げることができますか?したがって、それはまだクラス内から呼び出されるでしょうか?

私はそうは思わない、少なくとも簡単には...反射を使用しても、EventInfo.Invokeメソッドはありません。 AFAIK、イベントを発生させる唯一の方法は、クラス内から静的に

EDIT:実際に実行できます(Reedの回答を参照)。ただし、アプリケーションは完全に信頼性がなければ実行できません。

+0

トーマス:これを反映させる方法については、私の答えを参照してください。完全な信頼で、あなたは実際にクラスの外からでもそれを行うことができます。部分的な信頼では、これをパラメータとしてイベント名を取得するメソッドとして呼び出すように設定できます。 –

関連する問題