Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将事件和委托事件处理程序传递到泛型帮助器方法_C#_Events_Delegates - Fatal编程技术网

C# 将事件和委托事件处理程序传递到泛型帮助器方法

C# 将事件和委托事件处理程序传递到泛型帮助器方法,c#,events,delegates,C#,Events,Delegates,我的代码中都有这些。这是WP7 Silverlight应用程序 UIThreadExecutor.UIThreadExec.Execute(() => buttonControl.Click += new RoutedEventHandler(this.ButtonClickHandler)); 因此,上面的代码在UI线程上分配buttonControl。单击事件处理程序ButtonClickHandler的event。。

我的代码中都有这些。这是WP7 Silverlight应用程序

UIThreadExecutor.UIThreadExec.Execute(() => buttonControl.Click += 
                                new RoutedEventHandler(this.ButtonClickHandler));
因此,上面的代码在UI线程上分配
buttonControl。单击事件处理程序ButtonClickHandler的
event。。例如:

public void ButtonClickHandler(object sender, System.Windows.RoutedEventArgs e)
{

}
我想要的是重构:

UIThreadExecutor.UIThreadExec.Execute(() => buttonControl.Click += 
                                new RoutedEventHandler(this.ButtonClickHandler));
转换为单个静态但通用的帮助器方法-能够指定任何UI控件事件和事件处理程序。然后,该方法将使用UIThreadExecutor类将两者挂钩在一起

当然,buttonControl也可以是任何UI控件—具有相同类型的不同事件。它可能是一个带有选中事件的单选按钮

如果我转到VS 2010中RadioButton的定义。选中或单击按钮。它们都是相同类型的:

public event RoutedEventHandler Checked;
我一直在为这事挠头。我想,在我的静态助手中,声明一个委托(在名称空间级别声明):

然后我的助手方法如下所示:

public static void SubscribeToUIEvent(EventHandler eventToSubscribeTo, 
                                                        UIControlHandler handler)
{
    UIThreadExecutor.UIThreadExec.Execute(() => eventToSubscribeTo += handler);
}
这会导致编译错误:

运算符“+=”不能应用于类型为的操作数 “System.EventHandler”和uicontrol处理程序
无法将类型uicontrol处理程序“”隐式转换为“System.EventHandler”


有人能帮我指出正确的方向吗?这让我发疯。

关键词:多播代理

下面是关于C#中事件/委托的一般概述。

当然,您也可以使用带有事件偏差的接口

编辑2: 我发现:
这应该会有所帮助,我认为您不会得到更好的解决方案,因为不可能将ref参数传递给匿名方法。

只需完全摆脱这个UIThreadExecutor,就可以在工作线程上订阅事件。虽然这样做很不寻常,但很难理解您为什么需要这样做。这不太正确-
分配buttonControl。单击事件处理程序的事件按钮ClickHandler
,将事件处理程序分配给事件而不是对立面谢谢您的回复和链接。我想我明白了。您可以将多个方法分配给单个委托。每个方法都在调用单个委托时执行。但我不确定如何使用它来获得作为参数的通用方法—对象的事件和事件处理程序方法。然后我必须使用UIThreadExecutor类将它们连接在一起。UIThreadExecutor类是提供给我的,我必须使用它。如果你们能给我指出正确的方向,我将非常感激。非常感谢。你好@Felix K。谢谢你的帖子。不幸的是,我遇到了一个编译错误:无法在匿名方法、lambda表达式或查询表达式中使用ref或out参数'eventosubscribeto'。对其进行了更新,这是我能提供的最佳解决方案。感谢您的帮助和链接Felix K。我非常感谢!
public static void SubscribeToUIEvent(EventHandler eventToSubscribeTo, 
                                                        UIControlHandler handler)
{
    UIThreadExecutor.UIThreadExec.Execute(() => eventToSubscribeTo += handler);
}