C#: override метода без наследования класса?
Если очень хочется, то это можно сделать с помощью MethodRental.SwapMethodBody. Правда, это .net 2.0, если что.
Да, очень хочется, .net 2.0 вполне устраивает. Спасибо, буду копать в эту сторону. Просто в идеале эту процедуру сделать надо для всех контролов на форме, и переопределять тонну классов как-то совсем не хочется...
ИМХО, это чище, яснее и проще поддерживать.
Делаешь класс, унаследованный от Button - MyButton, например.
Далее открываешь файл твоей формы Form.Designer.cs и давишь Ctrl+H. Заменяешь System.Windows.Forms.Button на MyButton.
Далее если добавляешь кнопки на форму, не забудь, что это должны быть MyButton, которые после первой же успешной компиляции появятся в тулбоксе. Если забудешь - Ctrl+H спасет опять.
А зачем вообще тебе это нужно?
The method can only be called by the client that created the dynamicmodule that contains the type whose method's body is being swapped.То есть похоже, что нифига не выйдет.
Хм, ща проверю
![](/images/icons/tongue.gif)
![](/images/graemlins/smile.gif)
Действительно, не помогает.
![](/images/graemlins/smile.gif)
Ближе к делу: наследование класса для каждого нового типа контрола - это пиздец какой геморой, если я хочу взять и исправить форму. Особенно, если разновидностей контролов много. Были бы в C# макросы как в лиспе - так бы и сделал, но писать все это ручками - увольте.
А решить нужно следующую задачу: требуется в основном окне ловить ВСЕ кнопки, нажимаемые с клавиатуры когда фокус где угодно на форме. Если не переопределить IsInputKey для каждого контрола, то в полном соответствии с документацией теряются кнопки со стрелками и Tab, а они нужны.
но писать все это ручками - увольтемне тут однажды посоветовали генерировать адаптеры
Вообще если именно так ставить вопрос, то правильней было бы поставить фильтр на message queue (в Application где-то) и ловить WM_KEYDOWN напрямую.
поставить фильтр на message queue (в Application где-то)А это мысль интересная. Надо будет попробовать.
![](/images/graemlins/blush.gif)
Нет, не помогает. Ловится все, кроме стрелок и Tab, о чем, еще раз повторю, написано в MSDN.Я имел в виду, что возможно, если поставить Form.KeyPreview в true, то достаточно будет оверрайднуть IsInputKey только у формы.
Если нет - ставь фильтр, в МСДНе написано, что это может привести к тормозам, но вряд ли ты их заметишь =)
Я имел в виду, что возможно, если поставить Form.KeyPreview в true, то достаточно будет оверрайднуть IsInputKey только у формы.Не помогает. Кстати, если не поставить KeyPreview, то тогда форма просто не ловит клавиатуру, когда фокус у контролов.
Типа, как я понял, через рефлексию определяешь весь интерфейс нужного класса, и генерируешь класс, который реализует все необходимые интерфейсы (чтобы в форму можно было вставить содержит внутри ссылку на оригинальный контрол, и просто передаёт ему все вызовы (кроме тех, которые надо переопределить). Это называется адаптер, нужно такой для каждого класса сгенерировать автоматически.
Оставить комментарий
shlyumper
Имеется форма с кучей кнопок. Хочется, чтобы у всех кнопок прооверрайдился метод IsInputKey на свой собственный. Можно ли решить эту задачу как-либо кроме наследования своего класса от Button с последующим превращением всех кнопок из Button в этот свой класс?