cdm*_*kay 22 c# java closures wicket anonymous-inner-class
我正在编写C#Wicket实现,以加深我对C#和Wicket的理解.我们遇到的一个问题是Wicket大量使用匿名内部类,而C#没有匿名内部类.
因此,例如,在Wicket中,您可以像这样定义一个链接:
Link link = new Link("id") {
@Override
void onClick() {
setResponsePage(...);
}
};
Run Code Online (Sandbox Code Playgroud)
由于Link是一个抽象类,它强制实现者实现onClick方法.
但是,在C#中,由于没有匿名内部类,因此无法执行此操作.作为替代方案,您可以使用以下事件:
var link = new Link("id");
link.Click += (sender, eventArgs) => setResponsePage(...);
Run Code Online (Sandbox Code Playgroud)
当然,这有一些缺点.首先,可以有多个Click处理程序,这可能不太酷.它也不会强制实现者添加Click处理程序.
另一个选择可能是只有一个这样的闭包属性:
var link = new Link("id");
link.Click = () => setResponsePage(...);
Run Code Online (Sandbox Code Playgroud)
这解决了具有许多处理程序的问题,但仍然没有强制实现者添加处理程序.
所以,我的问题是,你如何在惯用的C#中模仿这样的东西?
Mat*_*ela 17
您可以使委托成为Link类的构造函数的一部分.这样用户就必须添加它.
public class Link
{
public Link(string id, Action handleStuff)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
然后以这种方式创建一个实例:
var link = new Link("id", () => do stuff);
Run Code Online (Sandbox Code Playgroud)