Можно ли вообще расширить System.Delegate? - PullRequest
2 голосов
/ 15 апреля 2009

Невозможно наследовать от System.Delegate или System.MulticastDelegate в C #. Это вполне возможно сделать в MSIL, если вы объявляете стандартные методы, управляемые во время выполнения. Однако каждый раз, когда я добавляю к типу метод cil managed, я получаю:

System.TypeLoadException: недопустимое определение для метода, реализованного во время выполнения.

Можно ли вообще расширить Delegate / MulticastDelegate?

Ответы [ 2 ]

8 голосов
/ 15 апреля 2009

Не с вашим собственным кодом, в C #. Из раздела 10.1.4 спецификации C # 3.0:

Прямой базовый класс типа класса не должно быть ни одного из следующих типы: System.Array, System.Delegate, System.MulticastDelegate, System.Enum, или System.ValueType. Кроме того, объявление общего класса не может использовать System.Attribute как прямой или косвенный базовый класс.

Однако каждый раз, когда вы создаете тип делегата, который автоматически выводится из MulticastDelegate.

С ECMA-335 , раздел 8.9.3:

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

Звучит так, будто это запрещает конструкторам. Вместо этого я лично использовал бы статический метод в обычном типе.

1 голос
/ 15 апреля 2009

Вам может быть интересно посмотреть на следующую запись Рика Строла, где он сравнивает различные методы динамического создания делегата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...