如何检测C#回调处理程序发送方

时间:2013-06-10 11:05:51

标签: c# .net callback handler

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

public delegate void SomeCallbackFromAPI(Guid threadId, int someInt)

这对我来说还不够好,我也希望收到发件人,因为我需要从我持有的控制器列表中识别此控制器,并且回调不提供我能识别的任何其他有效ID控制器。

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

有没有办法让回电发件人?

由于

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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);
        }
    }
}

编辑:实际上,不需要课程,只能使用闭包来完成。 :)

答案 2 :(得分:0)

您可以尝试通过StackTrace课程来获取来电者。

请参阅this answer