Как создать новый тип делегата на основе существующего в C #? - PullRequest
16 голосов
/ 14 мая 2009

Есть ли способ, которым я могу создать новый тип делегата на основе существующего? В моем случае я хотел бы создать делегата MyMouseEventDelegate, который имел бы ту же функциональность, что и EventHandler<MouseEventArgs>.

Зачем мне это? Чтобы воспользоваться преимуществами проверки типов во время компиляции , конечно! Таким образом, у меня может быть два разных делегата: MyRightClickHandler и MyLeftClickHandler, и никогда не следует путать их, даже если они оба функционально идентичны EventHandler<MouseEventArgs>.

Есть ли синтаксис для подобных вещей?

Да, и код вроде:

using MyRightClickHandler = EventHandler<MouseEventArgs>

недостаточно хорош. Он не выполняет никакой проверки типов, поскольку фактически не создает новый тип. И мне придется вставить такую ​​строку в каждый файл кода, в котором я буду ссылаться на MyRightClickHandler.

Ответы [ 4 ]

13 голосов
/ 14 мая 2009

Ну, это так же просто, как копировать объявление делегата из оригинала. В C # нет ничего, чтобы делать это автоматически, но я не вижу, что это большая нагрузка:

public delegate void MyLeftClickHandler(object sender, MouseEventArgs e);
public delegate void MyRightClickHandler(object sender, MouseEventArgs e);

Не похоже, что MouseEventHandler скоро изменится ...

Вы действительно были укушены ошибками из-за использования неправильных делегатов в неправильных местах? Я не помню, чтобы когда-либо сам обнаруживал, что это проблема, и мне кажется, что вы предлагаете больше работы (и незнакомый набор делегатов для других разработчиков) - вы уверены, что оно того стоит?

6 голосов
/ 14 мая 2009

Я хочу, чтобы вы только выполняли проверку типов во время компиляции. Думаю, этого было бы достаточно для создания специализированных классов EventArgs для описываемых вами случаев. Таким образом, вы все равно можете воспользоваться предопределенными делегатами:

class RightMouseButtonEventArgs : MouseEventArgs {}
class LeftMouseButtonEventArgs : MouseEventArgs {}

EventHandler<RightMouseButtonEventArgs>
EventHandler<LeftMouseButtonEventArgs>
4 голосов
/ 21 января 2016

Нет. Согласно документации C # , типы делегатов запечатаны, и вы не можете создать новый тип делегата, который наследует от существующего.

2 голосов
/ 05 сентября 2016

Я не верил Джон-Скит . Я должен был попробовать это для себя. Он был прав.

public void F(object sender, MouseEventArgs e) {}; 
public MyLeftClickHandler l;
public MyRightClickHandler r;
public void Test()
{
    l = F;  // Automatically converted.
    r = F;  // Automatically converted to a different type.
    l = r;  // Syntax error.  Incompatible types.
    l = new MyLeftClickHandler(r);  // Explicit conversion works.
}

Это не было очевидно!

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