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

C# 如何将自定义EventHandler发送到此类?,c#,.net,oop,events,C#,.net,Oop,Events,所以gtk夏普中有这样一个等级: 它接受EventHandler类型的事件。我想使用一个自定义事件处理程序,将字符串传递给它调用的函数 问题是,我似乎无法将CustomEventHandler提供给它。即使我在其定义中将EventHandler用作抽象类 为什么我不能做呢?我想我错过了一些明显的东西 编辑,我的代码: public MainWindow () : base (Gtk.WindowType.Toplevel) { Button button = new Button ("

所以gtk夏普中有这样一个等级:

它接受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_函数,MyCustomArghs),但无论我尝试哪种组合,总会出现一些错误。虽然MyEventHandler是EventHandler类的子类,但主要与尝试强制转换为类型EventHandler-event有关。

订阅事件的事件处理程序必须符合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
}

注意,当您采用这种方法时,您的实际事件处理程序根本不必具有任何类似于实际事件签名的内容。您只需要能够编写使实际事件参数适应处理程序将采用的参数所需的任何代码。如果您想完全忽略事件的实际参数,只传递其他参数,您可以。

请添加一些代码,以澄清您希望如何订阅
单击的
事件…
btn.Clicked+=??
我添加代码是为了更好地可视化我的意思。您添加的代码对解释您的问题没有多大帮助。您应该展示一个不起作用的代码示例,并详细解释它不起作用的原因(包括任何错误消息的精确引用)。另外,请不要参考外部链接。这很有效。但我并不完全理解这一点。为什么在:(sender,e)之前没有方法/类名?在这种情况下,“=>”号的作用是什么?您的解决方案是我一直在寻找的,但我想更好地理解它。没有方法名称,因为方法是(字面上!:)。
=>
是C#用于的语法。有关更多详细信息,请参阅此评论中的链接。