2013-01-22 43 views
3

我有很多功能,但我确实需要在另一个功能中运行它们。功能代码作为参数

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

public void Method1() 
{ 
bla bla 
} 


public void Method2() 
{ 
bla bla 
} 

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

,然后用这样的称呼他们:

wrapper(Method1()); 

的问题是THA有时我需要运行方法1和方法2,在同一时间。他们很多。 有时一个,有时几个在同一时间。

所以我想这将是巨大的,做这样的事情:

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

     } 
} 

运行方法内代码块,和方法的参数是代码块。 你认为这是可能的还是你会推荐另一种方法?

+2

http://msdn.microsoft.com/en-us/library/ms173171.aspx和http://msdn.microsoft.com/en-us/library/bb882516.aspx可能会有所帮助。 –

+0

如果你想将一个代码块传递给一个函数来执行,你想要的是一个lambda。 http://msdn.microsoft.com/en-us/library/bb397687.aspx – Patashu

回答

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表达式,你可以写本地函数,可以是 作为参数传递或返回函数调用的值。

+0

包装中的含义((s)=> –

+0

@RicardoPolo这相当于'动作 a =(s)=> {} ;'然后'Wrapper(a);' – horgh

+0

其中'(s)=> {}'是一个lambda表达式 – horgh

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(); 
    } 
}