代码作为参数的函数

时间:2013-01-22 00:19:53

标签: c# .net

我有很多功能,但我确实需要在另一个功能中运行它们。

我知道我可以做这样的事情

public void Method1()
{
bla bla
}


public void Method2()
{
bla bla
}

public void Wrapper(Action<string> myMethod)
        {
        method{
            myMethod()
              }
            bla bla
         }

然后用这样的东西打电话给他们:

wrapper(Method1());

问题是有时我需要同时运行Method1和Method2。他们很多。 有时一个,有时几个同时。

所以我认为做这样的事情会很棒:

Wrapper({bla bla bla; method(); bla bla; }
{
method{
bla bla bla;
 method();
 bla bla;

        }
}

在方法内运行代码块,方法的参数是代码块。 你认为是否有可能或者你会推荐另一种方法吗?

2 个答案:

答案 0 :(得分:3)

具有

public static void Wrapper(Action<string> myMethod)
{
    //...
}

您可以使用lambda expression指定myMethod

static void Main(string[] args)
{
    Wrapper((s) =>
    {
        //actually whatever here
        int a;
        bool b;
        //..
        Method1();
        Method2();
        //and so on
    });
}

那就是你不需要显式定义一个带有所需签名的方法(这里匹配Action<string>),但是你可以编写内联lambda表达式,无论你需要什么。

来自MSDN:

  

通过使用lambda表达式,您可以编写可以的本地函数   作为参数传递或作为函数调用的值返回。

答案 1 :(得分:2)

如果您已经有一些接受Action参数的方法,您可以使用匿名方法将一堆方法组合在一起以便顺序执行。

//what you have
public void RunThatAction(Action TheAction)
{
  TheAction()
}

//how you call it
Action doManyThings = () =>
{
  DoThatThing();
  DoThatOtherThing();
}
RunThatAction(doManyThings);

如果按顺序调用方法是经常做的事情,可以考虑制作一个接受尽可能多的动作的函数......

public void RunTheseActions(params Action[] TheActions)
{
  foreach(Action theAction in TheActions)
  {
    theAction();
  }
}

//called by
RunTheseActions(ThisAction, ThatAction, TheOtherAction);

你说“同时”两次,这让我想到了并行性。如果要同时运行多个方法,可以使用“任务”来执行此操作。

public void RunTheseActionsInParallel(params Action[] TheActions)
{
  List<Task> myTasks = new List<Task>(TheActions.Count);
  foreach(Action theAction in TheActions)
  {
    Task newTask = Task.Run(theAction);
    myTasks.Add(newTask);
  }
  foreach(Task theTask in myTasks)
  {
    theTask.Wait();
  }
}