В C # вы можете установить ограничения на события?
Нет.
Я хочу ограничить типы, которые могут подписываться на определенное событие, на основе интерфейса, который они реализуют.
Слушатели событий - это экземпляры делегатов типа, совместимого с типом события . «Типы» не являются слушателями событий.
т.е. Я хочу, чтобы объект «Сотрудник», реализующий IPerson, подписывался на обработчик событий, но другой объект «Грузовик», реализующий совершенно другой интерфейс, должен быть ограничен.
Объект "сотрудник" не слушает событие в первую очередь. Единственное, что слушает событие, это объект делегата .
Вы хотите сказать, что хотите принимать только делегаты, являющиеся делегатами, для методов, которые оказываются методами экземпляра определенного класса? Это очень странная вещь, и Я рекомендую вам не пытаться делать это .
Невозможно предотвратить это во время компиляции , но если вы действительно одержимы выполнением этой странной вещи, вы можете сделать это во время выполнения.
Для этого, как отмечают другие ответы, вы можете создать методы сумматора и средства доступа для события, а затем поставить в сумматоре проверку, которая проверяет, что получатель делегата относится к типу, который вы одобряете, и бросить исключение, если это не так.
Но опять же, это звучит как необычайно плохая идея. Слушатель должен решить, заинтересован ли он в событии или нет, а не источник события, чтобы проверить его слушателей. У пользователей есть разумное ожидание, что любое доступное событие может прослушать любой делегат совместимого типа.
Возможно, вы можете объяснить, почему вы хотите сделать эту странную вещь; возможно, есть лучший способ достичь своей цели.