有没有一种方法可以将扩展方法添加到Lambda表达式中?

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);
   }
  }
2个回答

6
很遗憾,没有这个功能。我之前博客里写过这个问题 :(
不过,只要正确选择缩进方式,你就可以让它看起来几乎和普通的循环一样了:
HelperType.Loop(count, 500, () =>
{
   // Code here
});

那就是许多Parallel Extensions示例的样子。
我不会把它作为扩展方法放在你实际不使用的东西上,只是为了使用“this”而不是真正的类型名称...除非你对它被称为“on”的对象有真正的用途。
(我还建议遵循.NET命名约定-使您的方法PascalCase。)

1

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

在我看来,对于核心类型(如委托/lambda类型或System.Object),实现扩展方法通常是一个不好的想法。

这只会导致混淆。我认为你提出的语法几乎没有任何优势:

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

对我来说,这远不如以下代码易读:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接