2009-08-04 21 views
7

Jak przekazać metodę jako argument? Robię to cały czas w JavaScript i muszę używać anonimowych metod do przekazywania parametrów. Jak to zrobić w języku C#?Przekaż metodę jako argument

protected void MyMethod(){ 
    RunMethod(ParamMethod("World")); 
} 

protected void RunMethod(ArgMethod){ 
    MessageBox.Show(ArgMethod()); 
} 

protected String ParamMethod(String sWho){ 
    return "Hello " + sWho; 
} 

Odpowiedz

13

Delegates zapewnić ten mechanizm. Szybkim sposobem na to w C# 3.0 dla twojego przykładu byłoby użycie Func<TResult> gdzie TResult jest string i lambdas.

Twój kod będzie się wtedy:

protected void MyMethod(){ 
    RunMethod(() => ParamMethod("World")); 
} 

protected void RunMethod(Func<string> method){ 
    MessageBox.Show(method()); 
} 

protected String ParamMethod(String sWho){ 
    return "Hello " + sWho; 
} 

Jednakże, jeśli używasz C# 2.0, można użyć anonimowego delegata zamiast:

// Declare a delegate for the method we're passing. 
delegate string MyDelegateType(); 

protected void MyMethod(){ 
    RunMethod(delegate 
    { 
     return ParamMethod("World"); 
    }); 
} 

protected void RunMethod(MyDelegateType method){ 
    MessageBox.Show(method()); 
} 

protected String ParamMethod(String sWho){ 
    return "Hello " + sWho; 
} 
+0

to by się nie skompilowało. RunMethod przejmuje Func przechodzisz do niego Func

+0

@StanR: Jest odpowiednio edytowany. –

+0

+1 za wyświetlenie alternatywy C# 2.0. –

9

Twój ParamMethod jest typu Func < String, String>, ponieważ trwa jeden argument ciąg i zwraca ciąg znaków (zwróć uwagę, że ostatnim elementem w nawiasach kątowych jest typ zwracany).

Więc w tym przypadku, kod stanie się coś takiego:

protected void MyMethod(){ 
    RunMethod(ParamMethod, "World"); 
} 

protected void RunMethod(Func<String,String> ArgMethod, String s){ 
    MessageBox.Show(ArgMethod(s)); 
} 

protected String ParamMethod(String sWho){ 
    return "Hello " + sWho; 
} 
+0

Dzięki za odpowiedź. Pojawia się błąd kompilacji "... RunMethod (Func , String) ma pewne nieprawidłowe argumenty. – Praesagus

+1

Którą wersję C# używasz? –

4
protected String ParamMethod(String sWho) 
{ 
    return "Hello " + sWho; 
} 

protected void RunMethod(Func<string> ArgMethod) 
{ 
    MessageBox.Show(ArgMethod()); 
} 

protected void MyMethod() 
{ 
    RunMethod(() => ParamMethod("World")); 
} 

To () => jest ważne. Tworzy anonimowy Func<string> z Func<string, string>, który jest ParamMethod.

+0

+1 jest to dobry przykład, chociaż jest trochę trudny –

0
protected delegate String MyDelegate(String str); 

protected void MyMethod() 
{ 
    MyDelegate del1 = new MyDelegate(ParamMethod); 
    RunMethod(del1, "World"); 
} 

protected void RunMethod(MyDelegate mydelegate, String s) 
{ 
    MessageBox.Show(mydelegate(s)); 
} 

protected String ParamMethod(String sWho) 
{ 
    return "Hello " + sWho; 
} 
Powiązane problemy