Я реализовал класс, который выглядит следующим образом:
[ImmutableObject(true)]
public interface ICustomEvent
{
void Invoke(object sender, EventArgs e);
ICustomEvent Combine(EventHandler handler);
ICustomEvent Remove(EventHandler handler);
ICustomEvent Combine(ICustomEvent other);
ICustomEvent Remove(ICustomEvent other);
}
Этот класс CustomEvent работает во многом как MulticastDelegate. Это может быть вызвано. Это может быть объединено с другим CustomEvent. А CustomEvent можно удалить из другого CustomEvent.
Теперь я хочу объявить класс следующим образом:
class EventProvider
{
public event CustomEvent MyEvent;
private void OnMyEvent()
{
var myEvent = this.MyEvent;
if (myEvent != null) myEvent.Invoke(this, EventArgs.Empty);
}
}
К сожалению, этот код не компилируется. Появляется ошибка компилятора CS0066:
'EventProvider.MyEvent': событие должно иметь тип делегата
По сути, мне нужно свойство, которое имеет добавить и удалить методы доступа вместо get и set . Я думаю, что единственный способ добиться этого - использовать ключевое слово event . Я знаю, что одной очевидной альтернативой является объявление двух методов, которые будут добавлять и удалять, но я также хочу этого избежать.
Кто-нибудь знает, есть ли хорошее решение этой проблемы? Интересно, есть ли способ обмануть компилятор, чтобы принять тип без делегата в качестве события. Возможно, пользовательский атрибут.
Кстати, кто-то задавал похожий вопрос на сайте expert-exchange.com. Поскольку этот сайт не бесплатный, я не вижу ответов. Вот тема: http://www.experts -exchange.com / Программирование / Языки / C_Sharp / Q_21697455.html