从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来为服务生成代理,并且手动编写代理不是一个选项,因为服务会定期更新。

从C#内部获取委托的实例

如果您先将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);

使用这种模式是否值得由你自己决定。