Patrón Interfaz Marcadora (II)
Introducción
En la entrada anterior, vimos en qué consistía el Patrón Interfaz Marcadora y cómo usarlo a través de interfaces.
En esta entrada vamos a ver cómo implementar el Patrón Interfaz Marcadora a través de atributos.
Implementación del Patrón Interfaz Marcadora con atributos
Lo primero que debemos hacer es crear una clase que actúe como atributo con el cuál decorar una clase con el fin de hacerla del tipo que deseemos.
Por ejemplo:
1: public class MarcadoraAttribute : System.Attribute
2: {
3: } // MarcadoraAttribute
Una vez creado este atributo, crearemos la clase que decoraremos con el atributo que hemos creado para hacerla del tipo que queremos.
1: [Marcadora]
2: public class Foo
3: {
4: } // Foo
Finalmente tendremos la posibilidad de verificar que una determinada clase, está marcada con el atributo que indica que es de un tipo concreto.
En nuestro caso y para el ejemplo que hemos preparado, quedará de la siguiente manera:
1: Foo foo = new Foo();
2: if (foo.GetType().IsDefined(typeof(MarcadoraAttribute), false))
3: {
4: MessageBox.Show("Es marcadora");
5: }
6: else
7: {
8: MessageBox.Show("No es marcadora");
9: }
Espero que esto le sirva a más de uno para conocer cómo funciona y como utilizar este patrón.
4 Responsesso far
Hola Jorge,
Tan solo añadiría una cosa que ya ha comentado Eduard en el anterior Post: Microsoft no recomienda el uso de interfaces vacía y es la causa del error CA1040 de Code Analysis (o FxCop para los amigos :)). Tenéis más información aquí: http://msdn.microsoft.com/en-us/library/ms182128(v=vs.80).aspx
Y efectivamente, la mejor forma de evitar este error es hacer lo que propones en este post 🙂
Hola Fernando.
Muchas gracias por aportar el enlace.
Es cierto que no se recomienda, pero nadie nos impide que en un desarrollo de Software anulemos la regla CA1040 de Code Analysis y hagamos interfaces marcadoras con interfaces vacías.
De hecho, repito que es incluso una posibilidad que puede resultar interesante, aunque yo prefiero el uso de atributos como se indica en esta segunda parte.
Supongo que como en todo, hay una línea muy delgada que separa lo recomendable de lo a veces necesario pese a que sepamos que no es lo recomendable.
¡Muchas gracias por la aportación!
Un saludo.
Hola Jorge,
Muy buenos posts!
Yo en mis desarrollos tengo un método extensores genérico, de esta guisa:(this T obj) where T:class
public static bool IsMarker
{
return obj.GetType().IsDefined(typeof(MarkerAttribute), false);
}
Un saludo!
Buen aporte Javier. 🙂