Cómo trabajar con métodos de extensión en C #

El lenguaje de programación C # proporciona soporte para métodos de extensión de C # 3.0. Un método de extensión es aquel que se usa para extender la funcionalidad de tipos existentes agregando métodos sin la necesidad de crear nuevos tipos derivados. No necesita crear subclases de clases existentes o recompilar o modificar sus clases existentes para trabajar con métodos de extensión. Los métodos de extensión mejoran la legibilidad de su código y, al mismo tiempo, le permiten ampliar la funcionalidad de los tipos existentes.

Los métodos de extensión comunes en .Net incluyen los operadores de consulta estándar LINQ que agregan capacidades de consulta adicionales a los System.Collections.IEnumerable and System.Collections.Generic.IEnumerabletipos. Tenga en cuenta que puede aprovechar los métodos de extensión para extender una clase o una interfaz, pero no puede anular sus métodos. MSDN dice: "Los métodos de extensión le permiten" agregar "métodos a tipos existentes sin crear un nuevo tipo derivado, recompilar o modificar de otro modo el tipo original. Los métodos de extensión son un tipo especial de método estático, pero se llaman como si eran métodos de instancia en el tipo extendido ".

Básicamente, un método de extensión es un tipo especial de método estático y le permite agregar funcionalidad a un tipo existente incluso si no tiene acceso al código fuente del tipo. Un método de extensión es como otro método estático, pero tiene la referencia "this" como primer parámetro. Puede agregar tantos métodos de extensión como desee a cualquier tipo. Lo más importante es que también puede agregar métodos de extensión incluso a un tipo de valor.

Cuando trabaje con métodos de extensión, tenga en cuenta estos puntos:

  • Un método de extensión debe ser un método estático
  • Un método de extensión debe estar dentro de una clase estática; la clase puede tener cualquier nombre
  • El parámetro en un método de extensión siempre debe tener la palabra clave "this" antes del tipo en el que se debe llamar al método.

Tenga en cuenta que si define un método de extensión en un tipo que tiene la misma firma que cualquier otro método del tipo que está extendiendo, nunca se llamará al método de extensión.

Programación de métodos de extensión en C #

En esta sección exploraremos cómo programar métodos de extensión usando C #. La siguiente lista de códigos ilustra cómo se ve un método de extensión.

public static class StringExtensions

    {

        public static bool IsNumeric(this string str)

        {

            double output;

            return double.TryParse(str, out output);

        }

    }

Tenga en cuenta el primer parámetro del método de extensión. Como ya se ha comentado, cualquier método de extensión debe ser estático y debe tener la palabra clave "this" antes del parámetro en el que desea que se llame al método. Cuando especifica la palabra clave "this" en la lista de parámetros de la forma en que se muestra en el ejemplo anterior, informa al compilador que se ha definido un método de extensión para la clase de cadena.

Así es como puede utilizar el método de extensión IsNumeric en una instancia de cadena.

static void Main(string[] args)

        {

            string str = "100";

            if (str.IsNumeric())

                Console.WriteLine("The string object named str contains numeric value.");

            Console.Read();

        }

Cuando ejecuta el programa anterior, el mensaje ("El objeto de cadena llamado str contiene un valor numérico." Se muestra en la ventana de la consola.

Puede usar métodos de extensión para inyectar nueva funcionalidad a través de métodos a un tipo sin la necesidad de modificar, derivar o recompilar el tipo original. Como mencioné anteriormente, los métodos de extensión también se pueden aplicar a tipos de valor. Veamos cómo se puede lograr esto con un ejemplo.

La siguiente clase llamada IntegerExtensions contiene un método de extensión llamado IsEven que devuelve verdadero si el número entero en el que se llama es par, falso en caso contrario.

public static class IntegerExtensions

    {

        public static bool IsEven(this int i)

        {

            return ((i % 2) == 0);

        }

    }

Y así es como puede usar el método de extensión IsEven en un número entero.

int n = 2;

if(n.IsEven())

 Console.WriteLine("The value of the integer is even.");