2013-08-11 36 views
13

Ho bisogno di un modo per definire un metodo in C# come questo:Passando una funzione come parametro di

public String myMethod(Function f1,Function f2) 
{ 
    //code 
} 

Let f1 è:

public String f1(String s1, String s2) 
{ 
    //code 
} 

c'è un modo per fare questo?

+1

[Delegati C#, metodi anonimi e espressioni Lambda] (http://www.codeproject.com/Articles/47887/C-Delegates-Anonymous-Methods-and-Lambda-Expressio) – I4V

risposta

23

Certo si può usare il Func<T1, T2, TResult> delegato:

public String myMethod(
    Func<string, string, string> f1, 
    Func<string, string, string> f2) 
{ 
    //code 
} 

Questo delegato definisce una funzione che prende due parametri di stringa e restituisce una stringa. Ha numerosi cugini per definire funzioni che prendono diversi numeri di parametri. Per chiamare myMethod con un altro metodo, si può semplicemente passare il nome del metodo, ad esempio:

public String doSomething(String s1, String s2) { ... } 
public String doSomethingElse(String s1, String s2) { ... } 

public String myMethod(
    Func<string, string, string> f1, 
    Func<string, string, string> f2) 
{ 
    //code 
    string result1 = f1("foo", "bar"); 
    string result2 = f2("bar", "baz"); 
    //code 
} 
... 

myMethod(doSomething, doSomethingElse); 

Naturalmente, se il parametro e ritorno tipi di f2 non sono esattamente la stessa cosa, potrebbe essere necessario regolare di conseguenza la firma del metodo.

+3

Inoltre: quando si desidera per eseguire f1 e f2, è sufficiente chiamarli come metodi. string result = f1 ("first", "second"); –

+1

Significa che devo chiamarli per nome (Jeroen van Langen)? –

+0

@ Babak.Abad Ho fornito un esempio su come chiamare 'f1' o' f2' come funzioni. –

Problemi correlati