Procedura: Implementare e chiamare un metodo di estensione personalizzato (Guida per programmatori C#)How to: Implement and Call a Custom Extension Method (C# Programming Guide)

Questo argomento illustra come implementare metodi di estensione personali per qualsiasi tipo .NET.This topic shows how to implement your own extension methods for any .NET type. 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.Client code can use your extension methods by adding a reference to the DLL that contains them, and adding a using directive that specifies the namespace in which the extension methods are defined.

Per definire e chiamare il metodo di estensioneTo define and call the extension method

  1. Definire una classe statica per contenere il metodo di estensione.Define a static class to contain the extension method.

    La classe deve essere visibile al codice client.The class must be visible to client code. Per altre informazioni sulle regole di accessibilità, vedere Modificatori di accesso.For more information about accessibility rules, see Access Modifiers.

  2. Implementare il metodo di estensione come metodo statico con almeno la stessa visibilità della classe che lo contiene.Implement the extension method as a static method with at least the same visibility as the containing class.

  3. Il primo parametro del metodo specifica il tipo su cui il metodo opera e deve essere preceduto dal modificatore this.The first parameter of the method specifies the type that the method operates on; it must be preceded with the this modifier.

  4. Nel codice chiamante, aggiungere una direttiva using per specificare lo spazio dei nomi che contiene la classe del metodo di estensione.In the calling code, add a using directive to specify the namespace that contains the extension method class.

  5. Chiamare i metodi come se fossero metodi di istanza sul tipo.Call the methods as if they were instance methods on the type.

    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.Note that the first parameter is not specified by calling code because it represents the type on which the operator is being applied, and the compiler already knows the type of your object. È sufficiente specificare gli argomenti per i parametri da 2 a n.You only have to provide arguments for parameters 2 through n.

EsempioExample

Nell'esempio seguente un metodo di estensione denominato WordCount viene implementato nella classe CustomExtensions.StringExtension.The following example implements an extension method named WordCount in the CustomExtensions.StringExtension class. Il metodo opera sulla classe String, che viene specificata come primo parametro del metodo.The method operates on the String class, which is specified as the first method parameter. Lo spazio dei nomi CustomExtensions viene importato nello spazio dei nomi dell'applicazione e il metodo viene chiamato all'interno del metodo Main.The CustomExtensions namespace is imported into the application namespace, and the method is called inside the Main method.

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

Sicurezza di .NET Framework.NET Framework Security

I metodi di estensione non presentano vulnerabilità di protezione specifiche.Extension methods present no specific security vulnerabilities. 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.They can never be used to impersonate existing methods on a type, because all name collisions are resolved in favor of the instance or static method defined by the type itself. I metodi di estensione non possono accedere ai dati privati nella classe estesa.Extension methods cannot access any private data in the extended class.

Vedere ancheSee also