Come implementare e chiamare un metodo di estensione personalizzato (Guida per programmatori C#)

Questo argomento illustra come implementare metodi di estensione personali per qualsiasi tipo .NET. Il codice client può usare i metodi di estensione aggiungendo un riferimento alla DLL che li contiene, e aggiungendo una direttiva using che specifica lo spazio dei nomi in cui vengono definiti i metodi di estensione.

Per definire e chiamare il metodo di estensione

  1. Definire una classe statica per contenere il metodo di estensione.

    La classe deve essere visibile al codice client. Per altre informazioni sulle regole di accessibilità, vedere Modificatori di accesso.

  2. Implementare il metodo di estensione come metodo statico con almeno la stessa visibilità della classe che lo contiene.

  3. Il primo parametro del metodo specifica il tipo su cui il metodo opera e deve essere preceduto dal modificatore this.

  4. Nel codice chiamante, aggiungere una direttiva using per specificare lo spazio dei nomi che contiene la classe del metodo di estensione.

  5. Chiamare i metodi come se fossero metodi di istanza sul tipo.

    Si noti che il primo parametro non viene specificato tramite la chiamata di codice, poiché rappresenta il tipo su cui viene applicato l'operatore e il compilatore conosce già il tipo dell'oggetto. È sufficiente specificare gli argomenti per i parametri da 2 a n.

Esempio

Nell'esempio seguente un metodo di estensione denominato WordCount viene implementato nella classe CustomExtensions.StringExtension. Il metodo opera sulla classe String, che viene specificata come primo parametro del metodo. Lo spazio dei nomi CustomExtensions viene importato nello spazio dei nomi dell'applicazione e il metodo viene chiamato all'interno del metodo 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);
        }
    }
}

Sicurezza .NET

I metodi di estensione non presentano vulnerabilità di protezione specifiche. Non possono mai essere usati per rappresentare metodi esistenti su un tipo, perché tutti i conflitti di nomi vengono risolti a favore dell'istanza o del metodo statico definito dal tipo stesso. I metodi di estensione non possono accedere ai dati privati nella classe estesa.

Vedi anche