Есть ли способ добавить метод расширения в лямбду? - PullRequest
3 голосов
/ 12 февраля 2010

В этом примере я хочу добавить .loop({quantity},{sleepvalue}) к методу

Я получил это для работы с этим:

this.loop(count, 500,
  ()=>{
   var image = Screenshots.getScreenshotOfDesktop();
   pictureBox.load(image);
   images.Add(image);
   updateTrackBar();
  });

используя этот метод расширения:

public static void loop(this Object _object, int count, int delay, MethodInvoker methodInvoker)
  {
   for(int i=0; i < count; i++)
   {
    methodInvoker();
    _object.sleep(delay);
   }
  }

, что означает, что синтаксис вызова:

this.loop(15,500, () => {...code...});

но в идеале я хотел сделать что-то вроде:

()=> { ...code...}.loop(10,500);

, который не работает, если я не сделаю это так:

new MethodInvoker(()=>{...code...}).loop(10,500);

, который будет работать с этой версией метода расширения:

public static void loop(this MethodInvoker methodInvoker, int count, int delay)
  {
   for(int i=0; i < count; i++)
   {
    methodInvoker();
    Processes.Sleep(delay);
   }
  }

Ответы [ 2 ]

6 голосов
/ 12 февраля 2010

Нет, к сожалению, нет.

Я писал об этом довольно давно: (

Однако при правильном выборе отступа вы можете сделать его почти идентичным обычному циклу:

HelperType.Loop(count, 500, () =>
{
   // Code here
});

Вот так выглядит множество примеров параллельных расширений

Я не будет делать это методом расширения для чего-то, что вы на самом деле не собираетесь использовать, просто чтобы вы могли использовать "this" вместо реального имени типа ... не если вы Во всяком случае, у нас есть реальное использование для объекта, который называется "on".

(Я бы также предложил следующие соглашения об именах .NET - сделайте ваши методы PascalCase.)

1 голос
/ 12 февраля 2010

Я действительно советую не пытаться делать это.

Часто, на мой взгляд, плохая идея реализовывать методы расширения для базовых типов, таких как тип делегата / лямбда или System.Object.

Это просто вызывает путаницу. Я вижу небольшое преимущество в предложенном вами синтаксисе:

() => { ..code... }.Loop(10, 500);

Для меня это гораздо менее читабельно, чем:

Utilities.RepeatWithDelay(10, 500, () => {....code... } );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...