Compartir a través de


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

En este artículo se muestra cómo implementar sus propios métodos de extensión para cualquier tipo de .NET. El código cliente puede usar sus métodos de extensión. Los proyectos cliente deben hacer referencia al ensamblaje que los contiene. Los proyectos cliente deben añadir una directiva using que especifique el espacio de nombres en el que se definen los métodos de extensión.

A partir de C# 14, hay dos sintaxis que puede usar para definir métodos de extensión. C# 14 agrega bloques de extensión, donde se definen miembros de extensión para un tipo. Antes de C# 14, agregue el modificador this al primer parámetro de un método estático para indicar que el método aparece como miembro de una instancia del tipo de parámetro.

Bloques de extensión (C# 14 y versiones posteriores)

A partir de C# 14, puede declarar métodos de extensión mediante bloques de extensión. Un bloque de extensión es un bloque de una clase estática no anidada, no genérica que contiene miembros de extensión para un tipo o una instancia de ese tipo.

Para definir y llamar a un método de extensión mediante bloques de extensión:

  1. Defina una class estática que contenga el método de extensión. La clase no puede estar anidada dentro de otro tipo y debe ser visible para el código cliente. Para obtener más información sobre las reglas de accesibilidad, vea Modificadores de acceso.
  2. Use un bloque de extensión para declarar miembros de extensión para un tipo.
  3. 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.
  4. Llame a los métodos como métodos de instancia en el tipo.

En el ejemplo siguiente se implementa un método de extensión denominado WordCount con la sintaxis de bloque de extensión C# 14. El método funciona en la String clase . El CustomExtensions espacio de nombres se importa en el espacio de nombres de la aplicación y el método se invoca como si fuera un método de instancia en la cadena.

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 {i}");


namespace CustomExtensions
{
    // Extension methods must be defined in a static class.
    public static class StringExtension
    {
        extension(string str)
        {
            // This is the extension member.
            // The `str` parameter is declared on the extension declaration.
            public int WordCount()
            {
                return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
            }
        }
    }
}

Métodos de extensión (versiones anteriores)

Antes de C# 14, debe declarar un método de extensión agregando este modificador al primer parámetro de un método estático.

Para definir y llamar a un método de extensión mediante la sintaxis clásica:

  1. Defina una class estática que contenga el método de extensión. La clase no puede estar anidada dentro de otro tipo y debe ser visible para el código 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 métodos de instancia en el tipo.

En el ejemplo siguiente se implementa un método de extensión denominado WordCount mediante la sintaxis clásica. El método funciona en la String clase , que se especifica como primer parámetro de método con el this modificador . El CustomExtensions espacio de nombres se importa en el espacio de nombres de la aplicación y se llama al método como si fuera un método de instancia en la cadena.

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 {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 to be extended.
        public static int WordCount(this string str)
        {
            return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }
}

Nota:

El primer parámetro no se especifica llamando al código porque representa el tipo en el que se aplica el método y el compilador ya conoce el tipo del objeto. Solo tiene que proporcionar argumentos para los parámetros comprendidos entre el 2 y n.

Información general

La resolución de sobrecarga prefiere los métodos estáticos o de instancia definidos por el propio tipo a los métodos de extensión. Los métodos de extensión no pueden tener acceso a los datos privados de la clase extendida.

Consulte también