2016-01-05 6 views
4

Я хочу создать некоторый движок для monogame в C#. Мой движок должен включать кнопку. Я хочу сделать это с помощью событий. В принципе, я сделал это, но я хочу улучшить его, и начались мои проблемы.Как отправить имя метода в качестве параметра

class Button : Component 
    { 
    .... 
    public event EventHandler<EventArgs> Click; 
    public void OnClick() 
    { 
     if (MousePressed() && Click != null) 
     { 
      Click(this, new EventArgs()); 
     } 
    } 
    } 

и когда я хочу, чтобы добавить Click событие я должен сделать это в другом классе:

_buttnon.Click += new EventHandler<EventArgs>(Method); 
_buttnon.OnClick(); 

Это работает хорошо, но я хочу сделать это следующим образом:

_button.RegisterClickEvent(Method); 

поэтому я добавил к классу Button код ниже:

public void RegisterClickEvent(XXX method) { 
     Click += new EventHandler<EventArgs>(method); 
} 

Я абсолютно не знаю, что мне нужно заменить XXX. Я пробовал:

public void RegisterClickEvent(void(object, EventArgs)method) { 
     Click += new EventHandler<EventArgs>(method); 
} 

но он не работает. Я пытался найти что-то в Google, но я не знаю, что я ищу.

+0

«Я абсолютно не знаю, что мне нужно заменить XXX». 'EventHandler '? –

ответ

1

Простое использование делегат:

public void RegisterClickEvent(EventHandler<EventArgs> method) 
    { 
    Click += new EventHandler<EventArgs>(method); 
    } 

или

public void RegisterClickEvent(EventHandler method) 
    { 
    Click += new EventHandler<EventArgs>(method); 
    } 

Это работает (по крайней мере в VS2015, может быть, есть другой путь, в предыдущем (до 2010 года, так как произошли некоторые изменения с делегатами).

2

То, что вы хотите, это action, что-то вроде этого:

public void RegisterClickEvent(Action<object, EventArgs> method) 
{ 
    Click += new EventHandler<EventArgs>(method); 
} 
+0

Он отлично работает, спасибо –

1

Из конструктора EventHandler<EventArgs> получить EventHandler<EventArgs> в качестве аргумента вы можете использовать код ниже:

public void RegisterClickEvent(EventHandler<EventArgs> method) 
{ 
    Click += new EventHandler<EventArgs>(method); 
} 

... 
RegisterClickEvent(Method); 
+0

Вы должны заметить, что это не сработает: RegisterClickEvent является статическим, но Click is not. –

+0

@cFrozenDeath спасибо за исправление.Это была плохая копия-паста из моей песочницы. –

1

Method - это группа методов. Группа методов не имеет типа, однако она может быть неявно преобразована в совместимый тип делегата. Если вы укажете делегат как параметр метода, вы можете вызвать метод с группой методов в качестве аргумента, и он будет неявно преобразован.

Переводя все это на свой код, он будет

public void RegisterClickEvent(EventHandler<EventArgs> handler) 
{ 
    Click += handler; 
} 

Если подпись Method совместима с EventHandler<EventArgs> делегатом, вы можете использовать его как

_button.RegisterClickEvent(Method); 

который будет эквивалентно

_button.RegisterClickEvent(new EventHandler<EventArgs>(Method)); 

На самом деле это не добавляет никакого дополнительного удовольствия ctionality к встроенному оператору += для событий.

Смежные вопросы