6 votes

Comment écrire une méthode avec un paramètre délégué en C# / .NET 4.0 ?

J'ai utilisé la façon dont je déclare un délégué au niveau de la classe :

protected delegate void FieldsDelegate();

//and then write a method e.g.

protected int CreateComponent(DbConnection cnctn, string tableName, Dictionary<string, object> changedFieldValues, FieldsDelegate fieldsDelegate)

Cependant, cette méthode est très lourde et je ne peux pas voir immédiatement à quoi ressemble le délégué. J'aimerais donc procéder de la manière suivante :

protected int CreateComponent(DbConnection cnctn, string tableName, Dictionary<string, object> changedFieldValues, delegate void fieldsDelegate())

afin de ne pas avoir de définition distincte.

Ce qui précède n'est pas autorisé pour une raison quelconque. Comment puis-je faire ?

12voto

Andrew Shepherd Points 16670

.NET fournit désormais la fonction Action y Func génériques à cette fin.

Dans votre cas, ce délégué ne prend aucun paramètre et ne renvoie rien.

// protected delegate void FieldsDelegate(); // Don't need this anymore

protected int CreateComponent(
                               DbConnection cnctn, 
                               string tableName, 
                               Dictionary<string, object> changedFieldValues, 
                               Action fieldsDelegate
                            )

S'il a pris une chaîne de caractères comme paramètre :

// protected delegate void FieldsDelegate(string s); 

protected int CreateComponent(
                               DbConnection cnctn, 
                               string tableName, 
                               Dictionary<string, object> changedFieldValues,
                               Action<string> fieldsDelegate
                             )

S'il prend une chaîne en paramètre et renvoie un bool :

// protected delegate bool FieldsDelegate(string s); 

protected int CreateComponent(
                               DbConnection cnctn, 
                               string tableName, 
                               Dictionary<string, object> changedFieldValues,
                               Func<string, bool> fieldsDelegate
                             )

5voto

Andrew Barber Points 25990

Vous pouvez utiliser l'option générique Action<T> y Func<T> et leurs variantes en tant que délégués, et l'avantage est que vous n'avez même pas besoin de définir un délégué séparé.

Action<T> prend en charge jusqu'à 16 paramètres de type différents : Action<T1, T2> et ainsi de suite ; chaque paramètre de type est le paramètre de type de la méthode située à la même position. Ainsi, Action<int, string> fonctionnerait pour cette méthode :

public void MyMethod(int number, string info)

Func<T> est identique, sauf qu'elle concerne les méthodes qui renvoient une valeur. Le dernier argument de type est le type de retour. Func<T> n'est pas ce que vous utiliseriez dans votre cas.

Exemple : Func<string, int, object> serait pour une méthode telle que :

public object MyOtherMethod(string message, int number)

L'utilisation de ces délégués génériques permet de savoir quels sont les arguments de ce délégué, ce qui semble être votre intention.

public void MyMethod(Action<string, MyClass>, string message)

En appelant cette méthode, vous savez que vous devez passer une méthode qui prend un string et un MyClass .

public void MeOtherMethod(Func<int, MyOtherClass>, int iterations)

Ici, vous savez que vous devez passer une méthode qui prend un int et renvoie le paramètre MyOtherClass

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