我从第三方API收到一些控制器,然后我注册了一些控制器公开的事件,事件回调处理程序带有签名:
public delegate void SomeCallbackFromAPI(Guid threadId, int someInt)
这对我来说还不够好,我也希望收到发件人,因为我需要从我持有的控制器列表中识别此控制器,并且回调不提供我能识别的任何其他有效ID控制器。
我知道这个什么时候调用,如果我可以发送者,我可以将它转换为我的控制器类型。
有没有办法让回电发件人?
由于
答案 0 :(得分:0)
这是不可能的。当调用委托时,它就像常规方法调用一样,所以除非调用者作为参数传递,如EventHandler<T>
中所示,否则你无法抓住它。
答案 1 :(得分: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);
}
}
}
编辑:实际上,不需要课程,只能使用闭包来完成。 :)
答案 2 :(得分:0)
您可以尝试通过StackTrace课程来获取来电者。
请参阅this answer。