2

サードパーティの API からコントローラーを受け取り、コントローラーが公開するイベントを登録します。イベント コールバック ハンドラーは署名付きです。

public delegate void SomeCallbackFromAPI(Guid threadId, int someInt)

これは私にとっては十分ではありません。私が保持しているコントローラーのリストからこのコントローラーを識別する必要があるため、送信者も受け取りたいのですが、コールバックはコントローラーを認識できる他の有効な ID を提供しません。

私はこれがいつ呼び出されるかを知っています。送信者ができれば、それをコントローラーの型にキャストできます。

コールバックの送信者を取得する方法はありますか?

ありがとう

4

3 に答える 3

0

デリゲートには と が含まれMethodますTarget。デリゲートを登録するときにサブスクライブしているコントローラーがわかっている場合は、デリゲートのターゲットに必要な情報を含めることができます。

namespace So17022438CallbackHandlers
{
    delegate void ApiCallback (Guid threadId, int param);

    class Program {
        class Handler {
            public string Name;
            public ApiCallback Callback;

            public Handler (string name)
            {
                Name = name;
                Callback = (id, param) => OnApiCallback(Name, param);
            }
        }

        static void Main (string[] args) {
            var apis = new[] { new Api(), new Api() };
            apis[0].RegisterCallback(new Handler("Name1").Callback);
            apis[1].RegisterCallback(new Handler("Name2").Callback);
            apis[0].CallCallback();
            apis[1].CallCallback();
            Console.ReadKey();
        }

        static void OnApiCallback (string name, int param) {
            Console.WriteLine(name + " - " + param);
        }
    }

    class Api {
        private ApiCallback _callback;

        public void RegisterCallback (ApiCallback callback) {
            _callback = callback;
        }

        public void CallCallback () {
            _callback(new Guid(), 1);
        }
    }
}

編集:実際には、クラスは必要ありません。クロージャーだけで実行できます。:)

于 2013-06-10T11:30:24.220 に答える
0

StackTraceクラスを介して呼び出し元を取得しようとすることができます。

この回答を参照してください。

于 2013-06-10T11:30:56.397 に答える
0

これは不可能です。デリゲートが呼び出されると、通常のメソッド呼び出しと同じように呼び出されるため、呼び出し元が のようにパラメーターとして渡されない限り、EventHandler<T>それを取得することはできません。

于 2013-06-10T11:29:52.847 に答える