Tip Rapido: Método Extensor - El blog de Javier Torrecilla

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.

Published 11/1/2011 21:31 por Javier Torrecilla
Archivado en:
Comparte este post:
http://geeks.ms/blogs/jtorrecilla/archive/2011/01/11/tip-rapido-m-233-todo-extensor.aspx

Comentarios

# re: Tip Rapido: Método Extensor

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.

Tuesday, January 11, 2011 10:12 PM por Pedro Hontas

# re: Tip Rapido: Método Extensor

post+ 1st comment = excelente !!!

Tuesday, January 11, 2011 10:36 PM por El Bruno

# re: Tip Rapido: Método Extensor

Versión generica:

using System;

namespace Util.ExtensionMethods

{

   public static class ComparableExtensionMethods

   {

       public static bool Between<T>(this T numero, T min, T max) where T:IComparable<T>

       {

           return numero.CompareTo(min) >= 0 && numero.CompareTo(max) <= 0;

       }

   }

}

Wednesday, January 12, 2011 8:52 AM por Carles

# re: Tip Rapido: Método Extensor

@Pedro, con el namespace en este caso te refieres a usar el namespace que engloba el tipo?

¿En el caso del ejemplo System?

Wednesday, January 12, 2011 8:53 AM por Javier Torrecilla

# re: Tip Rapido: Método Extensor

Gracias por el comentario @Carles!

Wednesday, January 12, 2011 9:10 AM por Javier Torrecilla

# re: Tip Rapido: Método Extensor

@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

Wednesday, January 12, 2011 10:00 AM por Lluis Franco

# [Debate] Nombre de Namespaces en métodos extensores ¿Y tu que opinas?

Ayer, a raíz de un post del colega Javier Torrecilla sobre métodos extensores, unos cuantos de nosotros

Thursday, January 13, 2011 1:19 PM por Lluís Franco on Geeks.ms

# [Debate] Nombre de Namespaces en métodos extensores ¿Y tu que opinas?

Ayer, a raíz de un post del colega Javier Torrecilla sobre métodos extensores, unos cuantos de nosotros

Thursday, January 13, 2011 3:52 PM por El blog de Lluis Franco

# re: Tip Rapido: Método Extensor

Hola,

una duda: ¿Cómo es que el método Between se asocia a las variables de tipo int?

Un saludo.

Thursday, January 13, 2011 4:15 PM por Miguel

# re: Tip Rapido: Método Extensor

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.

Thursday, January 13, 2011 4:32 PM por Javier Torrecilla

# re: Tip Rapido: Método Extensor

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,

Thursday, January 13, 2011 4:35 PM por Lluis Franco

# re: Tip Rapido: Método Extensor

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.

Thursday, January 13, 2011 4:37 PM por Miguel

# re: Tip Rapido: Método Extensor

Miguel, para que veas la referencia de la MSDN te dejo el enlace:

msdn.microsoft.com/.../bb383977.aspx

Thursday, January 13, 2011 4:39 PM por Javier Torrecilla

# re: Tip Rapido: Método Extensor

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...

Thursday, January 13, 2011 4:44 PM por Lluis Franco

# re: Tip Rapido: Método Extensor

Correcto. Usando el método genérico sirve para todos los tipos.

Gracias por responder tan rápido.,

Saludos.

Thursday, January 13, 2011 4:47 PM por Miguel

# Convertir un IEnumerable<T> a DataTable

Introducción En este post vamos a ver como llevar a cabo la exportación de un objeto IEnumerable<T>

Wednesday, April 4, 2012 12:15 PM por El blog de Javier Torrecilla

# [WinRT] Añadiendo algo de funcionalidad básica a la API.

Introducción Como me imagino que todos sabréis ya ha salido hace algún tiempo Windows 8, y la programación

Monday, November 26, 2012 11:15 AM por El blog de Javier Torrecilla