2

我从 3rd 方 API 收到了一些控制器,然后我注册了一些控制器公开的事件,事件回调处理程序带有签名:

public delegate void SomeCallbackFromAPI(Guid threadId, int someInt)

这对我来说还不够好,我也想接收发送者,因为我需要从我持有的控制器列表中识别这个控制器,并且回调不提供我可以识别控制器的任何其他有效 ID。

我知道它何时调用,如果我可以发送者我可以将它转换为我的控制器类型。

有没有办法获取回调的发送者?

谢谢

4

3 回答 3

0

这是不可能的。当一个委托被调用时,它就像一个常规的方法调用,所以除非调用者被作为参数传递,就像在 中一样EventHandler<T>,你不能抓住它。

于 2013-06-10T11:29:52.847 回答
0

代表包含MethodTarget。您可以让委托的目标包含您需要的信息,前提是您在注册委托时知道要订阅的控制器。

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 回答