如何将自定义EventHandler发送到此类?

时间:2014-11-29 03:27:57

标签: c# .net oop events

所以gtk中有这个类:

http://docs.go-mono.com/?link=E%3aGtk.Button.Clicked

它接受EventHandler类型的事件。我想使用自定义事件处理程序将字符串传递给它调用的函数。

问题是,我似乎无法将其提供给我的CustomEventHandler。即使我在其定义中使用EventHandler作为抽象类。

为什么我不能这样做?我想我错过了一些明显的东西......

编辑,我的代码:

public MainWindow () : base (Gtk.WindowType.Toplevel)
{
    Button button = new Button ("button");
    button.Clicked += new EventHandler(my_function);
    this.Add (button);
    Build ();
}
static void my_function(object obj, EventArgs args){
        //some code
}

我尝试将新的EventHandler更改为MyEventHandler(my_function,MyCustomArghs),但无论我尝试什么组合,总会有一些错误。主要与尝试强制转换为EventHandler类型有关 - 尽管MyEventHandler是EventHandler类的子类。

1 个答案:

答案 0 :(得分:1)

订阅事件的事件处理程序必须符合C#的委托类型规则。特别是,虽然你可以“扩大”论点,但你不能“缩小”它们。即您的参数可以是实际特定于委托的参数类型的基类型,但它们不能是它们的派生类。

您并未具体说明您在自定义EventArgs课程中实际 的内容。但是,处理这种情况的常用方法是使用匿名方法作为适配器将事件处理程序方法包装在与委托类型匹配的匿名方法中。

例如:

public MainWindow () : base (Gtk.WindowType.Toplevel)
{
    Button button = new Button ("button");
    button.Clicked += (sender, e) => my_function("some string literal");
    this.Add (button);
    Build ();
}
static void my_function(string text){
        //some code
}

请注意,采用此方法时,您的实际事件处理程序根本不必具有实际事件签名。您必须能够编写所需的代码,以使实际的事件参数适应您的处理程序将采用的那些。如果你想完全忽略事件的实际参数并传递其他东西,你可以。