Saltar al contenido

Escribir y usar métodos de extensión con C#

Dos de los grandes problemas de la clase de conversores de temperatura son que tenemos limitadas las posibles conversiones de temperatura y que no podemos modificar la clase porque es de un tercero. ¿Qué pasa si queremos usar conversiones más exóticas como Romer o Reaumur? No hay forma de modificar la clase y, como está sellada, no podemos heredarla y añadir los métodos que faltan.

Este es exactamente el tipo de problema para el que se crearon los métodos de extensión. Los métodos de extensión son una forma elegante de introducir nuevas funcionalidades en las clases sin tener que cambiar las clases mismas. Para crear un método de extensión, se requiere crear una clase estática con métodos estáticos. El primer parámetro en el método estático debe tener esta palabra clave antes del tipo. Con esta información, estamos listos para agregar la capacidad de convertir a Celsius en Romer.

Escribir y usar métodos de extensión con C#
Escribir y usar métodos de extensión con C#
1234567espacio de nombres MyLibrary.Extensiones{publicstaticclassTemperatureConverterExtensions{publicstaticdoubleToRomer(thisTemperatureConverter temperature)={{{{{{salida de la temperatura del convertidor *21/40+7.5;}}}

csharp

En nuestra firma del método ToRomer, vemos que la única diferencia entre un método de extensión y un método estático ordinario es esta palabra clave. Usar esto le dice al compilador que el método está disponible para ser usado como un método de extensión. No hay nada que nos impida usar esto como un método estático ordinario, pero ahora podemos usar el método como si estuviera disponible como parte de la clase original de TemperatureConverter.

Probemos esto escribiendo una clase ficticia de Celsius que crea una instancia de nuestra clase de Conversor de Temperatura y llama al método ToFahrenheit, de la clase original de Conversor de Temperatura, junto con el método ToRomer, de nuestra extensión.

1234567891011121314espacio de nombres MyLibrary.Models{publicclassCelsius{privateTemperatureConverter _converter;publicCelsius(double celsius){ _converter =newTemperatureConverter(celsius);}publicdouble Fahrenheit =[]; _converter. ToFahrenheit();publicdouble Romer => _converter.ToRomer();}}

csharp

En este ejemplo de código, realmente parece que ambos métodos son parte de la clase original. Pero espera, si estábamos escribiendo esto dentro de Visual Studio, ¿por qué no vemos aparecer Intellisense? Hay una razón por la que incluí el espacio de nombres en cada uno de estos ejemplos – el espacio de nombres es diferente para los métodos de extensión. Este es uno de los “gotas” con métodos de extensión. Para poder usar el método de extensión, tenemos que agregarlo usando << espacio de nombres>>, de lo contrario obtendremos un error de compilación. Por lo tanto, tenemos que agregar usando MyLibrary.Extensions; al archivo que contiene la clase Celsius.

No nos limitamos a clases selladas con métodos de extensión. Podemos añadir un método de extensión para una clase no sellada también. Vamos a crear una clase de peso que simplemente exponga el valor.

12345678publicclassWeight:IUnit{publicWeight(doble valor){ Value =valor;}publicdouble Value {get;}}

csharp

Obviamente, esta clase nos proporciona un valor limitado porque no hace nada relacionado con el peso. Podemos resolver esta deficiencia creando un método de extensión que asume que el valor de entrada está en libras y convierte el peso en piedras.

1234567clase estática pública PesoExtensiones{ estática pública doble ToStone(este peso) { peso de retorno.Valor / 14; }}

chsarp