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
- public static class ExtensionMethod
- {
- public static bool Between(this int original, int menor, int mayor)
- {
- return (original >= menor && original <= mayor);
- }
- }
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
- if (valorOriginal.Between(10, 20))
- {
- }
Espero que os sea de utilidad.
Saludos.
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.
post+ 1st comment = excelente !!!
Versión generica:
using System;
namespace Util.ExtensionMethods(this T numero, T min, T max) where T:IComparable
{
public static class ComparableExtensionMethods
{
public static bool Between
{
return numero.CompareTo(min) >= 0 && numero.CompareTo(max) <= 0; } } }
@Pedro, con el namespace en este caso te refieres a usar el namespace que engloba el tipo?
¿En el caso del ejemplo System?
Gracias por el comentario @Carles!
@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
Ayer, a raíz de un post del colega Javier Torrecilla sobre métodos extensores, unos cuantos de nosotros
Ayer, a raíz de un post del colega Javier Torrecilla sobre métodos extensores, unos cuantos de nosotros
Hola,
una duda: ¿Cómo es que el método Between se asocia a las variables de tipo int?
Un saludo.
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.
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,
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.
Miguel, para que veas la referencia de la MSDN te dejo el enlace:
http://msdn.microsoft.com/en-us/library/bb383977.aspx
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…
Correcto. Usando el método genérico sirve para todos los tipos.
Gracias por responder tan rápido.,
Saludos.
Introducción En este post vamos a ver como llevar a cabo la exportación de un objeto IEnumerable<T>
Introducción Como me imagino que todos sabréis ya ha salido hace algún tiempo Windows 8, y la programación