2013-08-11 16 views
13

Muszę sposób zdefiniować metodę w C# tak:Przechodząc do funkcji jako parametr

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

Niech f1 jest:

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

jest jakiś sposób, aby to zrobić?

+1

[C# Delegaci, metody anonimowe i wyrażeń lambdy] (http://www.codeproject.com/Articles/47887/C-Delegates-Aonymous-Methods-and-Lambda-Expressio) – I4V

Odpowiedz

23

Oczywiście można użyć Func<T1, T2, TResult> Delegat:

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

Ten delegat definiuje funkcję, która przyjmuje dwa parametry ciągów i zwraca ciąg znaków. Ma licznych kuzynów do definiowania funkcji, które przyjmują różną liczbę parametrów. Zadzwonić myMethod z inną metodą, można po prostu przechodzą w nazwie metody, na przykład:

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

Oczywiście, jeśli parametr i zwracają typy f2 nie są dokładnie takie same, może być konieczne odpowiednio dostosuj podpis metody.

+3

Ponadto: kiedy chcesz aby wykonać f1 i f2, wystarczy wywołać je jako metody. wynik ciągu = f1 ("pierwszy", "drugi"); –

+1

Czy to znaczy, że muszę je nazywać po imieniu (Jeroen van Langen)? –

+0

@ Babak.Abad Podałem przykład, jak wywoływać 'f1' lub' f2' jako funkcje. –

Powiązane problemy