Cómo: 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 dispone los métodos de extensión para el tipo en biblioteca de clases de .NET Framework., o cualquier otro tipo .NET que desea extender.El código cliente puede utilizar sus métodos de extensión agregando una referencia al archivo DLL que los contiene, así como una directiva using que especifica 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 clase estática que contenga el método de extensión.

    La clase debe estar visible para el código cliente.Para obtener más información sobre las reglas de accesibilidad, vea Modificadores de acceso (Guía de programación de C#).

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

  3. El primer parámetro del método especifica el tipo en el que funciona el método; debe estar 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 en el tipo.

    Observe que el código de llamada no especifica el primer parámetro porque éste representa el tipo en el que se aplica el operador y el compilador ya conoce el tipo del objeto.Sólo tiene que proporcionar argumentos para segundos parámetros a través de n.

Ejemplo

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

Compilar el código

Para ejecutar este código, debe copiarlo y pegarlo en un proyecto de aplicación de consola de Visual C# creado en Visual Studio.De manera predeterminada, el proyecto tiene como destino la versión 3.5 de .NET Framework y contiene una referencia a System.Core.dll y una directiva using para System.Linq.Si el proyecto no cumple uno o varios de estos requisitos, puede agregar lo que falte manualmente.Para obtener más información, vea Cómo: Crear un proyecto con LINQ.

Seguridad

Los métodos de extensión no presentan vulnerabilidades de seguridad concretas.No se pueden utilizar para suplantar los métodos existentes en un tipo, ya que todas las colisiones de nombre se resuelven a favor de la instancia o el método estático definido por el propio tipo.Los métodos de extensión no pueden obtener acceso a los datos privados de la clase extendida.

Vea también

Referencia

Métodos de extensión (Guía de programación de C#)

Clases estáticas y sus miembros (Guía de programación de C#)

protected (Referencia de C#)

internal (Referencia de C#)

public (Referencia de C#)

this (Referencia de C#)

espacio de nombres (Referencia de C#)

Conceptos

Guía de programación de C#

Otros recursos

LINQ (Language-Integrated Query)