Procedimiento para implementar e invocar un método de extensión personalizado (Guía de programación de C#)

En este tema se muestra cómo implementar sus propios métodos de extensión para cualquier tipo de .NET. El código de cliente puede usar los métodos de extensión agregando una referencia a la DLL que los contiene y agregando una directiva using que especifique el espacio de nombres en el que se definen los métodos de extensión.

Para definir y llamar al método de extensión

  1. Defina una class estática que contenga el método de extensión.

    La clase debe estar visible para el código de cliente. Para obtener más información sobre las reglas de accesibilidad, vea Modificadores de acceso.

  2. Implemente el método de extensión como un método estático con al menos la misma visibilidad que la clase contenedora.

  3. El primer parámetro del método especifica el tipo en el que opera el método; debe ir precedido del modificador this.

  4. En el código de llamada, agregue una directiva using para especificar el espacio de nombres que contiene la clase del método de extensión.

  5. Llame a los métodos como si fueran métodos de instancia del tipo.

    Tenga en cuenta que el primer parámetro no se especifica mediante el código de llamada, ya que representa el tipo al que se aplica el operador y el compilador ya conoce el tipo del objeto. Solo tiene que proporcionar argumentos para los parámetros comprendidos entre el 2 y n.

Ejemplo

En el ejemplo siguiente se implementa un método de extensión denominado WordCount en la clase CustomExtensions.StringExtension. El método opera en la clase String, que se especifica como el primer parámetro de método. El espacio de nombres CustomExtensions se importa en el espacio de nombres de la aplicación y se llama al método dentro del método 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);
        }
    }
}

Seguridad de .NET

Los métodos de extensión no presentan ninguna vulnerabilidad de seguridad específica. No se pueden usar nunca para suplantar los métodos existentes en un tipo, porque todos los conflictos de nombres se resuelven a favor de la instancia o del método estático definido por el tipo en cuestión. Los métodos de extensión no pueden tener acceso a los datos privados de la clase extendida.

Vea también