2010-02-11 4 views
3

В этом примере я хочу добавить .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); 
    } 
    } 

ответ

6

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

Я blogged about this довольно давно :(

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

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

Это то, что многие из Образцы параллельных расширений выглядят так:

I не будет сделать его методом расширения на то, что вы на самом деле не собираетесь использовать, просто чтобы вы могли использовать «это» вместо реального типа na меня ... нет, если у вас нет реального использования для объекта, который он называется «включен», во всяком случае.

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

+0

+1 для PascalCase. – SLaks

1

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

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

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

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

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

Utilities.RepeatWithDelay(10, 500,() => {....code... }); 
Смежные вопросы