Condividi tramite


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

Questo articolo illustra come implementare metodi di estensione personali per qualsiasi tipo .NET. Il codice client può usare i metodi di estensione. I progetti client devono fare riferimento all'assembly che li contiene. I progetti client devono aggiungere una direttiva using che specifica lo spazio dei nomi in cui 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 non può essere nidificata all'interno di un altro tipo e 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 metodi di istanza sul tipo.

Nota

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.

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.

using CustomExtensions;

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


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

La risoluzione dell'overload preferisce l'istanza o il metodo statico definito dal tipo stesso ai metodi di estensione. I metodi di estensione non possono accedere ai dati privati nella classe estesa.

Vedi anche