2015-03-11 3 views
-1

Я пытаюсь привязать метод к событию нажатия кнопки.Назначение делегата элементу управления

var controlEvent = button.GetType().GetEvent("Click"); 
var eventMethod = GetType().GetMethod("button_Click"); 
var handler = Delegate.CreateDelegate(controlEvent.EventHandlerType, button, eventMethod); 

void button_Click(object sender, EventArgs e) { } 

Когда я называю CreateDelegate я

Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type 

Я чувствую, что я передаю неправильные типов в CreateDelegate, но точно не уверен.

+1

Любая причина, по которой вы делаете это с отражением? –

+0

Нет, есть ли лучший способ? – Julien

+0

@Julien: Есть ли лучший способ сделать _what_? Какую проблему ты пытаешься решить? – SLaks

ответ

0

Здесь нет оснований для размышлений. Прошло некоторое время, так как я работал с WinForms/WebForms, но он должен выглядеть примерно так:

button.OnClick += button_Click; 

Я прокомментирую далее, что button_Click не хорошее название для метода, если то, что он делает не нажать на кнопку , Эта конвенция исходит из некоторых действительно старых руководств Microsoft, и это просто не хорошо. Название функции после того, что они делают, а не как они используются. Рассмотрим, насколько лучше это читает

button.OnClick += showCalculations; 

Я обычно идут на шаг дальше и избавиться от тупых (object, EventArgs) параметров, а также (если я не буду использовать их)

button.OnClick += (o,e) => showCalculations(); 
//... 
void showCalculations() { 
    //... 
} 
+0

Я неправильно понял ваш комментарий. Мне нужно найти методы по строке во время выполнения. – Julien

+0

@Julien: Почему? Обычно это неправильный подход. – SLaks

+0

люди могут писать сценарии, которые считываются при загрузке формы и добавляют/изменяют поведение. – Julien

0

Второй параметр Delegate.CreateDelegate является экземпляр класса для вызова метода.

Ваш метод не определен на button, поэтому вы получаете сообщение об ошибке.
Необходимо пройти this.