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:
- 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.
- Implementare il metodo di estensione come metodo statico con almeno la stessa visibilità della classe che lo contiene.
- Il primo parametro del metodo specifica il tipo su cui il metodo opera e deve essere preceduto dal modificatore this.
- Nel codice chiamante, aggiungere una direttiva
using
per specificare lo spazio dei nomi che contiene la classe del metodo di estensione. - 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.