0

お詫びに誤字脱字ありました...編集しました...

よくわからない奇妙な問題があります。

あるコードでは、他のクラスがリッスンできるイベントを持つシングルトンとして呼び出されるクラスがあり、次のようなことを行うことで非常に簡単です

Client.Instance.MyEvent += new EventHandler<EventArgs>(myHandler);

したがって、ジェネリッククラスがある場合:

Class MyTest {
   public MyTest() {
       System.Console.WriteLine("In Constructor Registering Events");
       Client.Instance.MyEvent += new EventHandler<EventArgs>(myHandler);
   }
   private void myHandler(object sender, EventArgs arg) {
      System.Console.WriteLine("Got event!");
   }
}

今、次のようなクラスを作成すると:

MyTest mC = new MyTest ();
Client.Instance.FireEvent();

期待される「In Constructor Registering Events」と「Got Event」を取得します

ただし、リフレクションを使用してクラスを作成する場合は作成しません。

Type mType = typeof(MyTest);
object mT = Activator.CreateInstance(mType);
Client.Instance.FireEvent();

「In Constructor Registering Events」だけが表示されますが、イベント起動メッセージは表示されません。何が起きてる?リフレクション呼び出しで何か間違ったことをしていますか?

ありがとう -

4

1 に答える 1

0

私はちょうどあなたの主張をテストしました.適切なタイプでは、オブジェクトがリフレクションを使用して作成されたか、newリフレクションを介して作成されたかに関係なく、同じように機能します.

次の実用的なデモは、ここでテストできます

public class Program
{
    public static void Main(string[] args)
    {                        
        Client.Instance.MyEvent += delegate { Console.WriteLine("MY EVENT handled from Main"); };

        MyTest mt = new MyTest();

        Type mType = typeof(MyTest);
        object reflectedMT = Activator.CreateInstance(mType);

        Client.Instance.FireEvent();
    }
}

public class Client {
    private Client() {}
    private static Client _inst = new Client();
    public static Client Instance { get { return _inst; } }
    public void FireEvent() { if(MyEvent != null) MyEvent(this, EventArgs.Empty); }
    public event EventHandler<EventArgs> MyEvent;
}

public class MyTest {
   public MyTest() {
      System.Console.WriteLine("In Constructor Registering Events");
      Client.Instance.MyEvent += new EventHandler<EventArgs>(myHandler);
   }
   private void myHandler(object sender, EventArgs arg) {
      System.Console.WriteLine("Got event!");
   }
}
于 2013-03-13T19:03:43.690 に答える