Partager via


Comment : implémenter et appeler une méthode d'extension personnalisée (Guide de programmation C#)

Cette rubrique indique comment implémenter vos propres méthodes d'extension pour le n'importe quel type dans le .NET Framework Class Library, ou tout autre type. NET que vous souhaitez étendre. 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 statique pour 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 (Guide de programmation C#).

  2. Implémentez la méthode d'extension comme une 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 fonctionne la méthode ; 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 que le compilateur connaît déjà le type de votre objet. Vous devez seulement fournir des arguments 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 fonctionne sur la classe String, spécifiée comme premier paramètre de méthode. L'espace de noms CustomExtensions est importé dans l'espace de noms de l'application et la méthode est appelée à l'intérieur de la méthode Main.

using System.Linq;
using System.Text;
using System;

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

Compilation du code

Pour exécuter ce code, copiez-le et collez-le dans un projet d'application console Visual C# qui a été créé dans Visual Studio. Par défaut, ce projet cible la version 3.5 du .NET Framework et il possède une référence à System.Core.dll et une directive using pour System.Linq. Si une ou plusieurs de ces spécifications sont absentes du projet, vous pouvez les ajouter manuellement. Pour plus d'informations, consultez Comment : créer un projet LINQ.

Sécurité

Les méthodes d'extension ne sont pas particulièrement vulnérables en termes de sécurité. Elles ne peuvent jamais être utilisées pour emprunter l'identité des méthodes existantes sur un type, car toutes les collisions de nom 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 aux données privées dans la classe étendue.

Voir aussi

Référence

Méthodes d'extension (Guide de programmation C#)

Classes statiques et membres de classe statique (Guide de programmation C#)

protected (référence C#)

internal (Référence C#)

public (référence C#)

this (référence C#)

Espace de noms (référence C#)

Concepts

Guide de programmation C#

Autres ressources

LINQ (Language-Integrated Query)