2011-07-03 19 views
22

¿Puede un método en C# devolver un método?¿Puede un método C# devolver un método?

Un método podría devolver un lambda expression por ejemplo, pero no sé qué tipo de parámetro de tipo podría darle a dicho método, porque un método no es Type. Tal método devuelto podría asignarse a algún delegado.

considerar este concepto como un ejemplo:

public <unknown type> QuadraticFunctionMaker(float a , float b , float c) 
{ 
    return (x) => { return a * x * x + b * x + c; }; 
} 

delegate float Function(float x); 
Function QuadraticFunction = QuadraticFunctionMaker(1f,4f,3f); 
+1

Ya * has * declarado el tipo de delegado necesario. ¿Cuál es exactamente tu pregunta aquí? –

Respuesta

31

Los tipos que está buscando son Action<> o Func<>.

Los parámetros genéricos en ambos tipos determinan la firma de tipo del método. Si su método no tiene valor de retorno, use Action. Si tiene un valor de retorno, use Func, donde el último parámetro genérico es el tipo de retorno.

Por ejemplo:

public void DoSomething()       // Action 
public void DoSomething(int number)    // Action<int> 
public void DoSomething(int number, string text) // Action<int,string> 

public int DoSomething()       // Func<int> 
public int DoSomething(float number)    // Func<float,int> 
public int DoSomething(float number, string text) // Func<float,string,int> 
0

Sus expresiones lambda tomarían un float como parámetro (creo), y luego devolver un float también. En .NET, podemos representarlo por el tipo Func<float, float>.

Generalmente, si se trata de lambdas que toman más parámetros, puede usar Func<Type1, Type2, Type3, ..., ReturnType>, con hasta ocho parámetros.

15
public Func<float, float> QuadraticFunctionMake(float a, float b, float c) { 
    return x => a * x * x + b * x + c; 
} 

El tipo de retorno es Func<float, float>.

-1

Puede usar la palabra clave dynamic. Consulte dynamic (C# Reference).

+5

Esta es la peor alternativa posible. –

+0

clave dinámica, todo lo que hace es omitir el tiempo de compilación de compilación y usar esta palabra clave será un truco en lugar de una solución – RaM

+0

Aunque no es una solución de tipo estático, debería funcionar, y es útil en ese sentido, incluso si "un truco". – Paul

2

<unknown type> = Function. Es decir,

public Function QuadraticFunctionMaker(float a , float b , float c) 
{ 
    return (x) => { return a * x * x + b * x + c; }; 
} 

es lo que está buscando, puesto que ya se ha declarado el delegado Function de igualar. Alternativamente, no necesita declarar ningún delegado y puede usar Func<float, Float> como lo notaron otros. Esto es exactamente equivalente. De hecho, Func<T, T> se declara exactamente de la misma manera que su delegado Function excepto que es genérico.

+0

Es mejor usar cosas como 'Func <>' y 'Action <>'. Creo que MS se está alejando de tener delegados personalizados en todo el lugar. – siride

+0

Esta es la única buena respuesta. Yo votaría todas las demás respuestas ... – Jeff

+0

@siride: no, no lo es.Cuando desea que su intención sea explícita, un delegado fuertemente definido es mejor – Jeff

Cuestiones relacionadas