4
public class a
{
   public event eventhandler test;
   public void  RaiseTest(){//fire test}
}

メソッドを呼び出さずに、このクラスの外部からこのクラスのテストを行うことは可能ですか?

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

発生するイベントをパラメーターとして受け入れるジェネリックRaise()を作成することは可能ですか?したがって、それでもクラス内から呼び出されますか?

4

2 に答える 2

5

これはReflectionを介して行うことができますが、それは明らかではありません。C#でイベントを宣言すると、イベント名+"Event"のフィールドがクラスに追加されます。フィールドで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 }); 
}

これにはインスタンスからNonPublicフィールドを取得する必要があるため、完全に信頼してのみ機能し、非常に制限されていることに注意してください。

発生するイベントをパラメーターとして受け入れるジェネリックRaise()を作成することは可能ですか?したがって、それでもクラス内から呼び出されますか?

はい。これを行うために上記のコードを変更するのはかなり簡単です。「myClassInstance」をこれに置き換えるだけです。NonPublic BindingFlagは問題ではなくなるため、これにより、これが完全に信頼できる状態で適切に機能するようになります。

于 2009-08-04T22:36:41.717 に答える
1

メソッドを呼び出さずに、このクラスの外部からこのクラスのテストを行うことは可能ですか?

簡単な答え:いいえ。

イベントを宣言するクラスだけがそれを上げることができます

発生するイベントをパラメーターとして受け入れるジェネリックRaise()を作成することは可能ですか?したがって、それでもクラス内から呼び出されますか?

そうは思いませんが、少なくとも簡単ではありません...リフレクションを使用してもEventInfo.Invoke方法はありません。AFAIK、イベントを発生させる唯一の方法は、クラス内から静的に行うことです

編集:実際には実行できますが(Reedの回答を参照)、アプリを完全に信頼して実行する必要があるという制限があります。

于 2009-08-04T22:30:00.967 に答える