Guide pratique pour implémenter et appeler une méthode d’extension personnalisée (Guide de programmation C#)

Cette rubrique montre comment implémenter vos propres méthodes d’extension pour n’importe quel type .NET. Le code client peut utiliser vos méthodes d’extension en ajoutant une référence à la DLL qui les contient, et en ajoutant une directive using qui spécifie l’espace de noms dans lequel les méthodes d’extension sont définies.

Pour définir et appeler la méthode d’extension

  1. Définissez une classe statiquepour contenir la méthode d’extension.

    La classe doit être visible par le code client. Pour plus d’informations sur les règles d’accessibilité, consultez Modificateurs d’accès.

  2. Implémentez la méthode d’extension en tant que méthode statique avec au moins la même visibilité que la classe conteneur.

  3. Le premier paramètre de la méthode spécifie le type sur lequel la méthode opère. Il doit être précédé du modificateur this.

  4. Dans le code appelant, ajoutez une directive using pour spécifier l’espace de noms qui contient la classe de méthode d’extension.

  5. Appelez les méthodes comme s’il s’agissait de méthodes d’instance sur le type.

    Notez que le premier paramètre n’est pas spécifié par le code appelant, car il représente le type sur lequel l’opérateur est appliqué, et le compilateur connaît déjà le type de votre objet. Vous devez fournir des arguments uniquement pour les paramètres 2 à n.

Exemple

L’exemple suivant implémente une méthode d’extension nommée WordCount dans la classe CustomExtensions.StringExtension. La méthode opère sur la classe String, qui est spécifiée comme premier paramètre de méthode. L’espace de noms CustomExtensions est importé dans l’espace de noms d’application, et la méthode est appelée à l’intérieur de la méthode Main.

namespace CustomExtensions
{
    // Extension methods must be defined in a static class.
    public static class StringExtension
    {
        // This is the extension method.
        // The first parameter takes the "this" modifier
        // and specifies the type for which the method is defined.
        public static int WordCount(this string str)
        {
            return str.Split(new char[] {' ', '.','?'}, StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }
}
namespace Extension_Methods_Simple
{
    // Import the extension method namespace.
    using CustomExtensions;
    class Program
    {
        static void Main(string[] args)
        {
            string s = "The quick brown fox jumped over the lazy dog.";
            // Call the method as if it were an
            // instance method on the type. Note that the first
            // parameter is not specified by the calling code.
            int i = s.WordCount();
            System.Console.WriteLine("Word count of s is {0}", i);
        }
    }
}

Sécurité .NET

Les méthodes d’extension ne présentent aucune faille de sécurité spécifique. Elles ne peuvent jamais être utilisées pour emprunter l’identité des méthodes existantes sur un type, car toutes les collisions de noms sont résolues en faveur de l’instance ou de la méthode statique définie par le type lui-même. Les méthodes d’extension ne peuvent pas accéder à des données privées dans la classe étendue.

Voir aussi