我正在尝试从他们的API中了解Interactive Brokers示例中的一部分代码。它是关于处理来自传入消息的数据,虽然我理解事件处理的一般流程,但我不明白这一部分:
ibClient.ScannerData += (reqId, rank, contractDetails, distance, benchmark, projection, legsStr) =>
HandleMessage(new ScannerMessage(reqId, rank, contractDetails, distance, benchmark, projection, legsStr));
这行代码中发生了什么? 我理解更宏大的方案中发生了什么,但不了解{{1}发生了什么}
ibClient.ScannerData += ([params]) => f(g([params]))
方法负责显然处理传入的消息,并且由于这行代码只运行一次,我相信这告诉HandleMessage
信息如何处理ibClient.ScannerData
信息被发送到ScannerData
。
这是ibClient
在后端看起来的样子 -
ibClient
public event Action<int, int, ContractDetails, string, string, string, string> ScannerData;
void EWrapper.scannerData(int reqId, int rank, ContractDetails contractDetails, string distance, string benchmark, string projection, string legsStr)
{
var tmp = ScannerData;
if (tmp != null)
tmp(reqId, rank, contractDetails, distance, benchmark, projection, legsStr);
}
的位置 -
EWrapper.scannerData
提供市场扫描仪产生的数据 请求。
答案 0 :(得分:2)
这基本上是为事件分配事件处理程序。让我们看一个更简单的示例,其中参数越少,以帮助澄清混淆。如果你查看Button
类,它有一个click事件,事件的签名是这样的:
public delegate void EventHandler(object sender, EventArgs e);
所以基本上要订阅按钮的Click
事件,您需要一个采用object
和EventArgs
的方法。所以要订阅它,你可以这样做:
button.Click += new EventHandler(Button_Click);
或者这个:
button.Click += (se, ev) => Button_Click(sender, e);
甚至简短,你可以这样做:
button.Click += Button_Click;
他们都在做同样的事情。他们说当按钮的Click
事件被触发时,调用Button_Click
方法。该方法如下所示:
private void Button_Click(object sender, EventArgs e)
{
// code here
}
+=
正在订阅,或者为Click
事件添加处理程序。您可以根据需要添加任意数量。如果您想取消订阅或删除处理程序,请使用-=
。
在您的情况下,事件是这样的:
public event Action<int, int, ContractDetails, string, string, string, string> ScannerData;
所以说要订阅ScannerData
事件,你需要一个需要7个参数的方法(2 int
s,ContractDetails
和4 string
s) 。所以要订阅它,你这样做:
ibClient.ScannerData += (reqId, rank, contractDetails, distance, benchmark, projection, legsStr) =>
HandleMessage(new ScannerMessage(reqId, rank, contractDetails, distance, benchmark, projection, legsStr));
Action
代表:
封装具有单个参数且不返回值的方法。
在您的情况下,它是Action
代表,其中包含更多参数。
这个=>
是一个lambda表示法。基本上它可能是这样的:
this.ScannerData += new Action<int, int, ContractDetails, string, string, string, string>(
HandleMessage
(new ScannerMessage(reqId, rank, contractDetails, distance,
benchmark, projection, legsStr));
您可以阅读this文章或google 活动hanlders with lambda 并且有很多文章。
答案 1 :(得分:0)
ibClient.ScannerData
是一个事件列表。
这会在列表中添加一个新事件:
ibClient.ScannerData += (reqId, rank, contractDetails, distance, benchmark, projection, legsStr) =>
HandleMessage(new ScannerMessage(reqId, rank, contractDetails, distance, benchmark, projection, legsStr));
这将获取事件列表,并调用所有已注册的事件:
var tmp = ScannerData;
if (tmp != null)
tmp(reqId, rank, contractDetails, distance, benchmark, projection, legsStr);
找到关于+ =操作函数的一些解释:+= new EventHandler(Method) vs += Method