Передача дополнительного параметра в System.Action, C # - PullRequest
2 голосов
/ 05 сентября 2011

Ну, у меня в библиотеке есть кнопка, которая выглядит следующим образом:

    public class Button  {
       public event Action<UIButtonX> onClicked;
       //
       // when button clicked, on OnClicked method is called
       //
       protected virtual void OnClicked () {
            if (onClicked != null) onClicked (this);
       }
    }

Когда я хочу обработать нажатие кнопки, я пишу что-то вроде:

button.onClicked += delegate{
  //do something
}

или

button.onClicked += HandleButtonClick;

void HandleButtonClick(UIButton obj){
}

Теперь я хочу передать параметр анонимному делегату, например

button.onClicked += delegate(UIButton obj, int id) {
 //do something with id
}

но компилятор не позволяет этого. Как решить эту проблему?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 05 сентября 2011

По внешнему виду вам нужно сделать что-то вроде этого:

public class Button
{
    public event Action<UIButtonX, int> onClicked;

    public int Id { get; set; }

    protected virtual void OnClicked ()
    {
        var e = this.onClicked;
        if (e != null)
        {
            e(this, this.Id);
        }
    }
}

И затем вы можете добавить свой обработчик:

button.onClicked += (button, id) => { /* code here */ }
1 голос
/ 05 сентября 2011

Я думаю, что лучше использовать события вместо действий, подумайте о прочтении некоторых из следующих похожих предложений: событие Action <> против события EventHandler <> и C # Action / Delegate Style Вопрос

И следующая статья весьма полезна для понимания различий между этими подходами: http://blog.monstuff.com/archives/000040.html

Надеюсь, это будет полезно для вас.

...