Langage C# – Les méthodes d’extension

D’un point de vue implémentation en C#, une méthode d’extension est une méthode statique contenue dans une classe statique, dont le type du premier paramètre est préfixé par le mot clé this. Ce type représente le type de données étendu. L’utilisation d’une méthode d’extension sur une instance est seulement une simplification d’écriture, car lors de la compilation du code C# en IL (Intermediate Language), la méthode est utilisée comme une méthode statique où l’instance sur laquelle la méthode est appliquée est passée en paramètre.

Les méthodes d’extension sont héritées. Autrement dit, il est possible d’appliquer à une instance d’une classe une méthode d’extension qui étendant une de ses classes de base. Aussi, si une méthode d’extension étend une interface, alors elle est applicable à toutes les instances des classes implémentant cette interface (y compris leurs classes héritées). Via ce principe, en étendant l’interface IEnumerable, Microsoft étend toutes les classes implémentant cette interface (dont la classe List).

Premier exemple : implémentons une méthode d’extension, étendant le type string du Framework .NET, afin d’ajouter une méthode indiquant une variable de ce type contient une donnée numérique :

namespace System
{
    public static class StringExtension
    {
        public static bool EstNumerique(this string data)
        {
            // Retour.
            return decimal.TryParse(data, out decimal d);
        }
    }
}

La classe StringExtension est définie dans l’espace de nom System afin de pouvoir être utilisée dans tout le code de l’application. Pour utiliser cette méthode :

string sData = "1236";
bool estNumerique = sData.EstNumerique();
if (estNumerique)
{
    // Bloc de code.
}
else
{
    // Bloc de code.
}

Second exemple : implémentons une méthode d’extension, étendant le type IEnumerable du Framework .NET, afin d’ajouter une méthode renvoyant la concaténation de la sérialisation de chaque objet de la collection dans une chaîne de caractères, séparée par une chaîne passée en paramètre (jouant le rôle de séparateur).

namespace System
{
    public static class ListExtension
    {
        public static string ToString<T>(this IEnumerable<T> aListe, string aCaractereSeparateur)
        {
            // Variables locales.
            StringBuilder stringBuilder;

            // Initialisation.
            stringBuilder = new StringBuilder();

            // Parcours et concaténation.
            foreach (T oObj in aListe)
            {
                if (stringBuilder.Length > 0)
                {
                    stringBuilder.Append(aCaractereSeparateur);
                }

                stringBuilder.Append(oObj.ToString());
            }

            // Retour.
            return stringBuilder.ToString();
        }

    }
}

Pour utiliser cette méthode :

List<string> oListeChaines = new List<string>() { "Formation", "Livre", "Support" };
string sConcatenation = oListeChaines.ToString(Environment.NewLine);

A l’issue de l’exécution de ce bloc de code, la variable sConcatenation contient :
Formation
Livre
Support

About: James RAVAILLE

Travaillant avec la plateforme Microsoft .NET depuis 2002, j’alterne les missions de formation et d’ingénierie avec cette plateforme. J’écris ce blog pour transmettre mes connaissances à tout développeur, qu’il soit débutant ou expérimenté.