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