从C#内部获取委托的实例
本文关键字:实例 获取 内部 | 更新日期: 2023-09-27 18:27:31
我正在使用WCF服务,对该服务的调用是使用异步方法调用的。由于我在Xamarin工作室工作,WCF代理必须使用silverlight工具(slsvcutil.exe)创建,因此这似乎是实现我所做工作的唯一方法。
要给服务打电话,我必须打这样的电话:
Soap.client.DoActionCompleted += Soap_client_DoActionCompleted;
Soap.client.DoActionAsync(parameter);
然后像这样声明DoActionCompleted的委托:
void Soap_client_DoActionCompleted(object sender, DoActionCompletedEventArgs e)
{
Soap.client.DoActionCompleted -= Soap_client_DoActionCompleted;
// Do stuff
}
我必须在调用后删除Soap_client_DoActionCompleted,以防止它以后对它进行更多调用。
问题是,我的代码中有很多这样的调用,在编写代码时,它开始变得非常混乱,很难遵循逻辑。我更希望能够内联地声明代码,这样更容易理解,比如这样:
Soap.client.DoActionCompleted += (sender, e) =>
{
Soap.client.DoActionCompleted -= x;
// Do stuff
}
Soap.client.DoActionAsync(parameter);
在上面的代码片段中,我希望能够传递它在内部的委托,然后将其移除,但问题是我不知道这是否可能。
虽然我知道几乎可以肯定有更好的方法来完成上述操作,但我有点被这样一个事实所困扰,即我需要使用slsvcutil.exe来为服务生成代理,并且手动编写代理不是一个选项,因为服务会定期更新。
如果您先将lambda表达式分配给委托变量,这是有可能的。它不会像你所希望的那样美好。
即便如此,为了避免使用未分配的局部变量编译器错误,您必须首先将委托变量初始化为null
,然后才能分配将引用其自身的lambda表达式。
因此,使用您的示例,它看起来是这样的(我假设DoActionCompleted
的类型是EventHandler
。如果我错了,只需调整):
EventHandler eventHandler = null;
eventHandler = (sender, e) =>
{
Soap.client.DoActionCompleted -= eventHandler;
// do stuff
};
Soap.client.DoActionCompleted += eventHandler;
Soap.client.DoActionAsync(parameter);
使用这种模式是否值得由你自己决定。