Как отправить пользовательский EventHandler в этот класс?

1

Таким образом, этот класс в 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
}

Я попытался изменить новый EventHandler на MyEventHandler (my_function, MyCustomArghs), но независимо от того, какую комбинацию я пытаюсь, всегда есть некоторые ошибки. В основном это связано с попыткой применить тип EventHandler - событие, хотя MyEventHandler является дочерним по классу EventHandler.

  • 1
    пожалуйста , добавьте код , чтобы уточнить , как вы хотите подписаться на Clicked событие ... btn.Clicked += ??
  • 0
    Я добавил код, чтобы визуализировать, что я имею в виду лучше.
Показать ещё 1 комментарий
Теги:
oop
events

1 ответ

1
Лучший ответ

Обработчик события, подписанный на событие, должен соответствовать правилам типа делегата С#. В частности, хотя вы можете "расширить" аргументы, вы не можете "сузить" их. Т.е. ваши аргументы могут быть базовыми типами фактических типов аргументов, специфичных для делегатов, но они не могут быть производными классами из них.

Вы не определенно о том, что вы на самом деле положили бы в свой собственный класс 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
}

Обратите внимание, что при использовании этого подхода ваш фактический обработчик событий не должен иметь ничего подобного фактической сигнатуре события. Вы просто должны иметь возможность писать любой код, необходимый для адаптации фактических аргументов событий к тем, которые будет выполнять ваш обработчик. Если вы хотите полностью игнорировать действительные аргументы события и просто передать что-то еще, вы можете.

  • 0
    Это сработало. Но я не понимаю этого полностью. Почему раньше нет имени метода / класса: (отправитель, e)? И что за знак "=>" выполняет в этом случае? Ваше решение - это то, что я искал, но я хотел бы понять его немного лучше.
  • 0
    Нет имени метода, потому что метод анонимный (буквально! :)). => - это синтаксис, который C # использует для лямбда-выражений . Смотрите ссылки в этом комментарии для более подробной информации.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню