2009-08-04 21 views
7

¿Cómo paso un método como argumento? Hago esto todo el tiempo en Javascript y necesito usar métodos anónimos para pasar los parámetros. ¿Cómo lo hago en C#?Pasar un método como argumento

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

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

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

Respuesta

13

Delegates proporcionar este mecanismo. Una forma rápida de hacerlo en C# 3.0 para su ejemplo sería usar Func<TResult> donde TResult es string y lambdas.

Su código se convertiría entonces en:

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

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

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

Sin embargo, si usted está usando C# 2.0, se podría utilizar un delegado anónimo en lugar:

// 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

esto no se compilaría. RunMethod toma un Func que le está pasando Func

+0

@StanR: Se edita en consecuencia. –

+0

+1 para mostrar la alternativa C# 2.0. –

9

Su ParamMethod es de tipo Func < String, String> porque toma un argumento de serie y devuelve una cadena (tenga en cuenta que el último elemento en los corchetes angulares es el tipo de retorno).

lo tanto, en este caso, el código se convertiría en algo como esto:

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

Gracias por la respuesta. Obtengo un error de compilación '... RunMethod (Func , String) tiene algunos argumentos inválidos. – Praesagus

+1

¿Qué versión de C# estás usando? –

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

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

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

Eso () => es importante. Crea un Func<string> anónimo del Func<string, string> que es ParamMethod.

+0

+1 este es un buen ejemplo, aunque es un poco complicado –

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; 
} 
Cuestiones relacionadas