小编Met*_*eta的帖子

如何使用lambda创建一个新的EventHandler?

看起来像我应该有我需要这里的一切,但是使它的细节恰巧被我逼疯了.

我有一个静态实用工具方法,它接受一个Web服务客户端对象,从中提取一个指定的EventInfo,并且应该为该事件添加一些处理程序,实质上是Web服务调用完成时的回调.问题是,因为任何给定的事件本身都有自己的处理程序重载(WCF生成的代码SomeMethodCompletedEventArgs为每个方法和相应的事件提供唯一的),我无法弄清楚如何实现这一点.

我有两个我想要附加的处理程序,第一个只是一个lambda函数:

(obj, args) => task.Complete()
Run Code Online (Sandbox Code Playgroud)

所以我想做的就是这么简单:

eventInfo.AddEventHandler(client, new EventHandler((obj, args) => task.Complete()));
Run Code Online (Sandbox Code Playgroud)

但是,这会生成运行时InvalidCastException,因为eventInfo需要一个EventHandler<SomeMethodCompletedEventArgs>而不是一个普通的EventHandler.我相信这意味着我需要以某种方式动态创建EventHandler委托eventInfo.EventHandlerType,但我还没想到要将它与lambda函数结合起来,或者使接收器真的不关心EventArgs正在使用的特定风格.

我发现的唯一解决方法是创建一个通用模板参数,用于传递特定的事件参数类型.这使我能够:

eventInfo.AddEventHandler(client, new EventHandler<E>(...));
Run Code Online (Sandbox Code Playgroud)

E参数在哪里有问题.然而,这显然是笨拙的,当提取的信息eventInfo告诉我们所有我们需要知道的时候,必须通过它似乎是错误的.

值得注意的是,我正在使用一个稍微受限制的Xamarin PCL框架,它显然不包括Delegate.CreateDelegate()我在相关问题中提到的静态方法.不过,我确实可以访问Activator大部分相同的基础.

c# wcf xamarin

7
推荐指数
2
解决办法
1059
查看次数

标签 统计

c# ×1

wcf ×1

xamarin ×1