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

Aggiornamento: novembre 2007

In questo argomento viene illustrato come implementare i metodi di estensione personali per qualsiasi tipo nella Libreria di classi di .NET Framework o per qualsiasi altro tipo .NET che si desidera estendere. Il codice client può utilizzare i metodi di estensione aggiungendo un riferimento alla DLL che li contiene e aggiungendo una direttiva using che specifica lo spazio dei nomi nel quale sono 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 ulteriori informazioni sulle regole di accessibilità, vedere Modificatori di accesso (Guida per programmatori C#).

  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 sul quale opera il metodo. Deve essere preceduto dal modificatore this.

  4. Nel codice che effettua la chiamata, 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 è specificato dal codice che effettua la chiamata perché rappresenta il tipo sul quale viene applicato l'operatore e il compilatore è già a conoscenza del tipo dell'oggetto. È necessario fornire solo gli argomenti per i parametri 2 tramite n.

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


Per eseguire questo codice, copiarlo e incollarlo in un progetto di applicazione console di Visual C# creato in Visual Studio. Per impostazione predefinita, questo progetto è destinato alla versione 3.5 di .NET Framework e contiene un riferimento a System.Core.dll e una direttiva using per System.Linq. Se uno o più di questi requisiti non sono presenti nel progetto, è possibile aggiungerli manualmente. Per ulteriori informazioni, vedere Procedura: creare un progetto LINQ.

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

Aggiunte alla community

Mostra: