39 votes

Une méthode C# peut-elle retourner une méthode ?

Une méthode en C# peut-elle retourner une méthode ?

Une méthode peut renvoyer un expression lambda par exemple, mais je ne sais pas quel type de paramètre je pourrais 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é.

Prenons l'exemple de ce concept :

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

45voto

Zebi Points 3773

Les types que vous recherchez sont Action<> o Func<> .

Les paramètres génériques des 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>

25voto

siride Points 36602
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> .

3voto

Konrad Rudolph Points 231505

<unknown type> = Function . C'est-à-dire,

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

C'est ce que vous cherchez puisque vous avez déjà déclaré le délégué. Function pour correspondre. Alternativement, vous n'avez pas besoin de déclarer un délégué du tout et vous pouvez utiliser la fonction Func<float, Float> comme l'ont remarqué d'autres personnes. C'est exactement équivalent. En fait, Func<T, T> est déclaré exactement de la même manière que votre délégué Function sauf que c'est générique.

0voto

Vos expressions lambda prendraient un float en tant que paramètre (je crois), puis renvoie un fichier float également. Sur .NET nous pouvons le représenter par le type Func<float, float> .

Généralement, si vous avez affaire à des lambdas qui prennent plus de paramètres, vous pouvez utiliser Func<Type1, Type2, Type3, ..., ReturnType> avec un maximum de huit paramètres.

-6voto

AMgdy Points 2367

Vous pouvez utiliser le dynamic mot-clé. Voir dynamique (référence C#) .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X