Une méthode en C # peut-elle renvoyer une méthode?
Une méthode pourrait renvoyer un expression lambda par exemple, mais je ne sais pas quel type de paramètre de type puis-je donner à une telle méthode, car une méthode n'est pas Type
. Une telle méthode retournée pourrait être assignée à un délégué.
Considérez ce concept comme un exemple:
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);
Les types que vous recherchez sont Action<>
ou Func<>
.
Les paramètres génériques sur les deux types déterminent la signature de type de la méthode. Si votre méthode n'a pas de valeur de retour, utilisez Action
. S'il a une valeur de retour, utilisez Func
où le dernier paramètre générique est le type de retour.
Par exemple:
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>
public Func<float, float> QuadraticFunctionMake(float a, float b, float c) {
return x => a * x * x + b * x + c;
}
Le type de retour est Func<float, float>
.
<unknown type>
= Function
. C'est,
public Function QuadraticFunctionMaker(float a , float b , float c)
{
return (x) => { return a * x * x + b * x + c; };
}
C'est ce que vous recherchez, car vous avez déjà déclaré le délégué Function
correspondant. Alternativement, vous n'avez pas du tout besoin de déclarer un délégué et vous pouvez utiliser Func<float, Float>
comme d'autres l'ont remarqué. C'est exactement équivalent. En réalité, Func<T, T>
est déclaré exactement de la même manière que votre délégué Function
sauf qu'il est générique.
Vos expressions lambda prendraient un float
comme paramètre (je crois), puis renverraient également un float
. Dans . NET , nous pouvons représenter cela par le type Func<float, float>
.
En général, si vous traitez des lambdas qui prennent plus de paramètres, vous pouvez utiliser Func<Type1, Type2, Type3, ..., ReturnType>
, avec jusqu'à huit paramètres.