Métodos de Extensión, pon un “this” en tu desarrollo

Hello world!

¿Cuantas veces nos ha pasado que tenemos que agregar funcionalidad a un tipo ya existente? O peor aún ¿que pasa si tenemos que modificar algo también existente que no sabemos que repercusiones tendrá? y ¿si tenemos que mapear entre objetos? Estas y algunas otras preguntas son las que intentaré destripar en este post.

Vamos con un poquito de literatura, ¿Qué son los métodos de extensión? Según la msdn:

Los métodos de extensión permiten “agregar” métodos a los tipos existentes sin crear un nuevo tipo derivado, recompilar o modificar de otra manera el tipo original. Los métodos de extensión son una clase especial de método estático, pero se les llama como si fueran métodos de instancia en el tipo extendido.

Esta muy bien la definición, pero no acabo de ver esto de los métodos de extensión, ni como aplicarlo a mi código… Y si os digo .ToString()string.IsNullOrWhiteSpace(xxxx), y muchos otros que seguro que habéis utilizado millones de veces y no os habíais parado a pensar que esa funcionalidad “extra” de los tipos que la nos proporciona el propio framework de .NET, podríamos aplicarla a nuestros tipos…

Empezaremos declarando la  clase Phone:

public class Phone
    {
        public Guid Id { get; set; }
        public string SerialNumber { get; set; }
        public string Model { get; set; }
        public string Description { get; set; }
        public List Properties { get; set; }
    }

En esta clase lo primero que se me ocurre es querer validar si tiene informadas Properties  o no… ya que a la larga tendremos que hacer mil veces la validación de si tiene registros, con la típica doble validación de if(phone.Properties != null && phone.Properties.Count > 0). la verdad que ese if metido en cada uno de los sitios desde donde tengamos que utilizar nuestra clase Phone no es demasiado “elegante”. ¿Como resolveríamos esto de una forma mas elegante? pues extendiendo nuestra clase de la siguiente manera:

public static class PhoneExtension
    {
        public static bool HasProperties(this Phone source)
        {
            if (source.Properties != null && source.Properties.Count > 0)
                return true;
            else
                return false;
        }
    }

Es esta clase podemos ver 2 puntos clave, uno es que la clase tiene que ser estática, y el otro es el this que ponemos en el parámetro del método, este especifica para que tipo va a funcionar este método, es decir, este método pertenece al tipo “xxxx”.

Otra de las cosas para las que se puede utilizar esto, es para el mapeo entre diferentes tipos, por ejemplo para convertir tu dto a tu viewModel. Vale si, me diréis que actualmente ya hay librerías como AutoMapper que me lo hace “automaticamente”, pongo esto entre comillas porque efectivamente te lo hace “automaticamente” siempre y cuando cumpla la convención de nombres… Pero eso no siempre es así, o incluso hay veces que nos va a interesar tener un control mas exhausto del mapeo. Veamos un ejemplo:

En este caso nos crearemos una clase PhoneDto que tendrá solamente 2 propiedades que serán las que tengamos que transportar entre capas:

public class PhoneDto
{
      public string SerialNumber { get; set; }
      public string Description { get; set; }
}

Dentro de la misma clase estática que nos habíamos creado previamente, podemos incluir algo como esto:

public static PhoneDto ToPhoneDto(this Phone source)
{
      if (source == null) return null;
      var result = new PhoneDto();
      result.Description = source.Description;
      result.SerialNumber = source.SerialNumber;
      return result;
}

Y con esto ya tendríamos nuestro mapper implementando, simplemente extendiendo nuestro modelos de datos.

Por ultimo quedaría ver como utilizarlo. Pues es tan simple como nombre del objeto “punto” y esto ya nos mostrará el intelligence (OJO, hay que añadir el using*) con todas las extensiones/propiedades que tenga nuestro objeto!

extension
Intelligence VS mostrando la extensión

Hasta VS 2015, se tenia que añadir el using a mano… pero a partir de esta versión, con la combinación de teclas “Ctrl + .” ya te sabe reconocer y proponer tus propias extensiones para importarlas como using.

Espero que os resulte útil!

Un saludo y hasta pronto!

Métodos de Extensión, pon un “this” en tu desarrollo

Resumen 2016

Hello world!

Después de mucho tiempo sin escribir, o mejor dicho, sin poner nada nuevo, ya que las entradas de este sitio vienen de un blog anterior, tengo la intención de volver a escribir. No penséis que durante este tiempo he estado parado… nada mas lejos de la realidad, si que he estado parado en términos literarios pero no en “faranduleo”, definiendo “faranduleo” como el acto de ponerse delante de “x” personas para explicarles cositas… vamos, lo que viene siendo dar charlas! Esto es algo que me hacia especial ilusión hacer, el hecho de poder transmitir pero “face to face”, nada de hacerlo escupiendo 4 palabras en un blog!

Acreditación Codemotion 2016
Acreditación Codemotion 2016

Todo esto del “faranduleo” empezó un día cualquiera, hace ya un año, en una conversación de café… Conseguí “engañar” a mi compañera Carmen para embarcarnos en esta nueva aventura. Después de mil horas de preparación, nervios, tensión y montones de sensaciones inexplicables, el resumen es el siguiente:

Si a esto sumamos una formación que impartí para mis compis de Pasiona sobre MVC… Cerramos el año con 9 eventos! Quizá ahora entendáis un poco mejor el porque he tenido olvidado el tema del blog…

Equipo [T] en Codemotion 2016
Equipo [T] en Codemotion 2016

Y este es el resumen de 2016 a nivel de “faranduleo”. Ahora toca descansar, centrarme en el blog y encarar 2017 con ganas y fuerzas renovadas!

Os dejo en enlace a todas las slides de las charlas –> Aquí

Saludos y hasta pronto!

Resumen 2016