Я в процессе написания реализации С# Wicket, чтобы углубить свое понимание С# и Wicket. Одна из проблем, с которыми мы сталкиваемся, - это то, что Wicket сильно использует анонимные внутренние классы, а С# не имеет анонимных внутренних классов.
Итак, например, в Wicket вы определяете ссылку следующим образом:
Link link = new Link("id") {
@Override
void onClick() {
setResponsePage(...);
}
};
Поскольку Link является абстрактным классом, он заставляет разработчика реализовать метод onClick.
Однако в С#, поскольку нет анонимных внутренних классов, нет никакого способа сделать это. В качестве альтернативы вы можете использовать такие события:
var link = new Link("id");
link.Click += (sender, eventArgs) => setResponsePage(...);
Конечно, есть пара недостатков с этим. Прежде всего, может быть несколько обработчиков Click, что может и не быть круто. Он также не заставляет конструктора добавлять обработчик Click.
Другим вариантом может быть просто свойство закрытия, подобное этому:
var link = new Link("id");
link.Click = () => setResponsePage(...);
Это решает проблему наличия множества обработчиков, но все равно не заставляет конструктора добавлять обработчик.
Итак, мой вопрос: как вы эмулируете что-то подобное в идиоматическом С#?