实际上正在发生的事情是:
1) ViewModel 被赋予一个 IServiceAgent 实例
2) ViewModel 将使用 IServiceAgent 获取和发送数据。 viewmodel 不知道如何获取数据,但会告诉 serviceagent 获取它。
3) IServiceAgent 并不意味着知道 ViewModel 或如何分配给它。
这是您的问题所在。代表在做什么,为什么需要 (s,e)。
The (s,e) => {} is effectively a way of saying this:
void anonymousMethod(Object s, EventArgs e){};
为什么要这样做?
答案是因为您希望 IServiceAgent 更新 viewModel,但不具有对 ViewModel 的引用。怎么可能做到。好吧,它可以使用具有返回类型的普通方法来完成。但在这种情况下,您使用的示例文章希望异步返回其值。这可以通过传统方法完成,但它会阻止您的视图模型。实际上,您正在实施的是一个类似的事件。委托是事件的合同。因此,无论谁实现该事件,都必须遵守委托提供的合同,例如:
textbox.Click += (s,e) => {((TextBox)s).Text = "Ive been clicked!"};
-或-
textbox.Click += new ClickHandler(myClickHandler);
void myClickHandler(Object sender, EventArgs args){}
-或-
textbox.Click += myClickHandler;
void myClickHandler(Object sender, EventArgs args){}
这些都符合点击事件(由事件委托定义)指定的合同。
如果你将它与文本框类中定义的内容进行比较,它看起来像:
Class TextBox{
event ClickEventHandler Click;
delegate ClickEventHandler (Object sender, EventArgs args);
}
因此,这意味着要实现文本框单击事件,您必须提供一个方法,该方法具有 Object sender 的两个输入 EventArgs a 并具有 void 返回类型。此方法可以有任何名称。
您的问题中使用的 lambda 是 delgate。委托用于建立方法合同。您的 lambda 遵守合同,因此它是有效的。 (s,e) 的含义取决于您所遵守的合同的代表:
EventHandler<GetPeopleCompletedEventArgs> callback
我相信会产生类似的东西:
(Object Sender, GetPeopleCompletedEventArgs args) <-------> (s,e)
这似乎有点疯狂,要理解为什么很难看到 s 和 e 是什么,但智能感知应该(它适用于我的 resharper)显示 s、e 的类型。 (s,e) 的语法非常常见,第一个几乎总是与 .net 事件相同的是 (Object,EventArgs)