Tip Rapido: Método Extensor

Bueno aquí va un mini-post.

Cuantas veces os habéis encontrado con:

if (a>=5 and a<=10)

Yo al menos recuerdo unas pocas.

Bueno aquí va el mini truco. Creamos una clase estática con un método extensor:

Code Snippet
  1. public static class ExtensionMethod
  2.  {
  3.    public  static bool Between(this int original, int menor, int mayor)
  4.      {
  5.          return (original >= menor && original <= mayor);
  6.      }
  7.  }

Ahora simplemente hacemos el using de la clase en donde queramos utilizarla y el IntelliSense de Visual Studio será capaz de asociar este método a nuestras variables de tipo int:

 

Code Snippet
  1. if (valorOriginal.Between(10, 20))
  2.             {
  3.  
  4.             }

Espero que os sea de utilidad.

 

Saludos.

17 comentarios sobre “Tip Rapido: Método Extensor”

  1. Javier….mejor si como namespace de la clase extensora usas el mismo que el del tipo que quieres extender (int)…asi no tendrás que hacer el using.

  2. Versión generica:

    using System;

    namespace Util.ExtensionMethods
    {
    public static class ComparableExtensionMethods
    {
    public static bool Between(this T numero, T min, T max) where T:IComparable
    {
    return numero.CompareTo(min) >= 0 && numero.CompareTo(max) <= 0; } } }

  3. @Javier: @Pedro se refiere a que para poder usar los métodos extensores, éstos deben ser ‘visibles’ desde el namespace de tu aplicación, por lo que una de dos, o usas el nombre del namespace del tipo (System) o usas el mismo namespace de tu aplicación.
    Por ejemplo para poder hacer esto:

    int i = 5;
    this.Text = i.Between(4, 6) ? “yes” : “no”;

    El método extensor Between debe estar en un namespace ‘conocido’ o vas a tener que meter un using.
    Un saludo! Muy buen post y comentarios!
    PD – La versión genérica es muy chula Carles :-) adoro Generics

  4. Hola @Miguel, esto se debe a la primera parte de los parametros que estamos usando:
    Si observas el primer parametro: “Original” viene precedido de “this Int”.

    De está manera definis a que tipo se va agregar el método, si miras el comentario de Carles se le indica T para que aplique a cualquier tipo que implemente IComparabl, en este caso.

  5. Hola Miguel,
    Lo hace mediante Generics. Verás que en el comentario de Carlos (o en mi otro post) se hace uso de un método genérico.
    Eso significa que ese método puede usarse con diversos tipos de objetos, que se definirá con el tipo del primer parámetro (verás que lleva la palabra clave this y está definido en el método como tipo T).
    Si no dices nada por defecto se aplicará a TODOS los objetos, pero si quieres retringirlo -como es el caso- lo puedes hacer con un where, para como en el ejemplo, limitarlo a todos los objetos que implementan la interfaz IComparable.
    Saludos,

  6. Hola de nuevo,

    copié el código e hice algunas pruebas cambiando el primer parámetro para extender “Decimal”. Funcionó muy bien.

    Ahora me entró el gusanillo y voy a buscar algo más de información sobre extensores.

    Gracias.

  7. Hola de nuevo Miguel,

    > hice algunas pruebas cambiando el primer parámetro para extender “Decimal”. Funcionó muy bien.

    Ojo! Al ser un método genérico no necesitas cambiar nada para que funcione con Decimal. Puedes usar el mismo método (sin cambiar ni una coma) con int o decimal y otros…

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *