有没有办法将扩展方法添加到Lambda?

时间:2010-02-11 23:13:41

标签: c# lambda

在此示例中,我想向方法

添加.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 个答案:

答案 0 :(得分:6)

不,不幸的是没有。

很久以前我blogged about this :(

但是,通过正确选择缩进,您可以使其看起来与普通循环几乎相同:

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

这就是很多Parallel Extensions样本的样子

不会使它成为你实际上不会使用的东西的扩展方法,只是为了你可以使用“this”而不是真正的类型名称......除非无论如何,你已经真正使用了它被称为“on”的对象。

(我还建议遵循.NET命名约定 - 制作方法PascalCase。)

答案 1 :(得分:1)

我真的建议不要尝试这样做。

在我看来,在核心类型上实现扩展方法通常是一个坏主意,例如委托/ lambda类型或System.Object。

这只会引起混淆。我认为你提出的语法没什么好处:

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

对我而言,这远不如:

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