【问题标题】:How do I send custom EventHandler to this class?如何将自定义 EventHandler 发送到此类?
【发布时间】:2014-11-29 03:27:56
【问题描述】:

所以在gtk sharp中有这个类:

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
}

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

【问题讨论】:

  • 请添加一些代码来说明您希望如何订阅Clicked 事件...btn.Clicked += ??
  • 我添加了代码以更好地可视化我的意思。
  • 您添加的代码对解释您的问题没有多大帮助。您应该展示一个不起作用的代码示例,并详细解释它为什么不起作用(包括任何错误消息的准确引用)。另外,请不要引用外部链接。

标签: c# .net oop events


【解决方案1】:

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

您并没有具体说明您将在自定义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
}

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

【讨论】:

  • 这行得通。但我并不完全理解这一点。为什么之前没有方法/类名:(sender,e)?在这种情况下,“=>”符号有什么作用?你的解决方案是我一直在寻找的,但我想更好地理解它。
  • 没有方法名,因为方法是anonymous(字面意思!:))。 => 是 C# 用于 lambda expressions 的语法。有关详细信息,请参阅此评论中的链接。
猜你喜欢
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 2022-08-19
相关资源
最近更新 更多