我从 3rd 方 API 收到了一些控制器,然后我注册了一些控制器公开的事件,事件回调处理程序带有签名:
public delegate void SomeCallbackFromAPI(Guid threadId, int someInt)
这对我来说还不够好,我也想接收发送者,因为我需要从我持有的控制器列表中识别这个控制器,并且回调不提供我可以识别控制器的任何其他有效 ID。
我知道它何时调用,如果我可以发送者我可以将它转换为我的控制器类型。
有没有办法获取回调的发送者?
谢谢
这是不可能的。当一个委托被调用时,它就像一个常规的方法调用,所以除非调用者被作为参数传递,就像在 中一样EventHandler<T>,你不能抓住它。
代表包含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);
}
}
}
编辑:实际上,不需要类,它可以单独使用闭包来完成。:)
您可以尝试通过StackTrace类获取调用者。
看到这个答案。