Написать c # реализацию абстрактного класса inline?

Я нашел отличный пример кода, написанного в java для использования классов таймера / timertask …

В настоящее время я превращаю это в c # для реализации «Mono для 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 #, я хотел бы создать унаследованный класс из TimerTask (абстрактный класс) и метод run и т. Д., Не создавая отдельный класс (расширяющий TimerTask), как это делает код Java.

Может ли кто-нибудь мне посоветоваться по синтаксису c # для создания этого абстрактного класса inline вместо создания отдельного класса только для наследования и реализации TimerTask?

Solutions Collecting From Web of "Написать c # реализацию абстрактного класса inline?"

C # не поддерживает встроенные классы, как в Java. Вы можете определить анонимные методы, но не целые классы. Таким образом, вам нужно будет определить отдельный класс, который реализует абстрактный класс.

Как говорит Дарин, анонимная функция – это путь сюда. Вы только пытаетесь указать один бит поведения, поэтому просто попросите метод принять Action а затем вызывающий может использовать анонимную функцию (анонимный метод или выражение лямбда). Вызывающий код будет выглядеть так:

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

Или, если у вас много кода, вы хотите использовать метод с преобразованием группы методов:

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

В Java я редко нахожу, что хочу сделать больше, чем переопределить один метод внутри анонимного внутреннего класса, так что анонимные функции на 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 # в вашем проекте, вы можете добавить метод расширения. Создайте открытый статический класс где-нибудь в вашем проекте:

 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);