C#中的匿名内部类

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)