写c#抽象类内联的实现?

我发现了一个用java编写的代码,用于定时器/ timertask类的一个很好的例子…

我目前正在把它转换为C#的“单一的Android”的实现,但无法转换抽象类的内联实现TimerTask

// Here's the original java code private void resetMapChangeTimer() { mChangeDelayTimer.schedule( new TimerTask() { @Override public void run() { // Some code to run } }, longTenSeconds); } 

当我在c#中实现这个时,我想创build一个从TimerTask(抽象类)和run方法等内联的inheritance类,而不必像上面的java代码创build一个单独的类(扩展TimerTask)。

任何人都可以build议我的C#语法来创build此抽象类内联,而不是创build一个单独的类只是inheritance和实现TimerTask?

Solutions Collecting From Web of "写c#抽象类内联的实现?"

C#不像Java那样支持内联类。 你可以定义匿名方法,但不能定义整个类。 所以你将不得不定义一个实现抽象类的单独的类。

正如Darin所说,匿名function是这里的一种方式。 你只是试图指定一点行为,所以只要让方法接受一个Action ,然后调用者就可以使用一个匿名函数(匿名方法或lambdaexpression式)。 调用代码如下所示:

 changeDelayTimer.Schedule(() => { // Code to run }, TimeSpan.FromSeconds(10)); 

或者如果你有很多的代码,你会想要使用一个方法,并进行方法组转换:

 changeDelayTimer.Schedule(MethodContainingCode, TimeSpan.FromSeconds(10)); 

在Java中,我很less发现我想要做的不仅仅是覆盖匿名内部类中的单个方法 – 所以C#中的匿名函数几乎总是在这里工作。

将代码从Java移植到C#时,不要尝试保留Java成语 – 保留相同的目标 ,而是移植到.NET成语中,在这种情况下,使用委托以抽象方式表示单个行为。

如果你想使用/扩展现有的Java类,你可以实现一个通用的帮助类:

 class MyTimerTask: TimerTask { private Action action; public MyTimerTask(Action action) { this.action = action; } public override void Run() { if(action != null) action(); } } 

然后你可以使用匿名方法:

 mChangeDelayTimer.Schedule(new MyTimerTask(() => { //Do something }), longTenSeconds); 

为了在您的项目中拥有最好的C#经验,您可以进一步添加扩展方法。 在你的项目的某个地方创build一个公共静态类:

 public static class TimerHelper { public static void Schedule(this DelayTimer /*or whatever your timer class is*/ timer, Action action, int delay) { if(timer == null) throw new ArgumentNullException("timer"); //null check needed because this method is not really an instance method timer.Schedule(new MyTimerTask(action), delay); } } 

然后你可以使用下面的代码:(TimerHelper类必须对执行上下文的“可见”才能显示出来,因此它是公共的)

 mChangeDelayTimer.Schedule(() => { //Do something }, longTenSeconds);