Tengo un par de clases que deseo etiquetar con un atributo en particular. Tengo dos enfoques en mente. Una implica el uso de una clase que extiende el atributo. El otro utiliza una interfaz vacío:Interfaces o atributos para etiquetar clases?
Atributos
public class FoodAttribute : Attribute { }
[Food]
public class Pizza { /* ... */ }
[Food]
public class Pancake { /* ... */ }
if (obj.IsDefined(typeof(FoodAttribute), false)) { /* ... */ }
interfaz
public interface IFoodTag { }
public class Pizza : IFoodTag { /* ... */ }
public class Pancake : IFoodTag { /* ... */ }
if (obj is IFoodTag) { /* ... */ }
estoy reticentes a utilizar los atributos debido a su uso de Reflexión. Al mismo tiempo, sin embargo, dudo en crear una interfaz vacía que realmente solo sirva como etiqueta. He sometido a pruebas de esfuerzo ambos y la diferencia de tiempo entre los dos es solo de unos tres milisegundos, por lo que el rendimiento no está en juego aquí.
preguntaba, ¿Qué haces si un objeto es un alimento? si la interfaz IFood está vacía, ¿para qué los distingues? ... – serhio
Si el objeto es Comida, devolvería FoodEventArguments. Si el objeto fuera, por ejemplo, Bebida, devolvería DrinkEventArguments. Básicamente, hay una clase base común (digamos ConcessionStandItem) que pasa a la función. – Scott
Vea también: http://blogs.msdn.com/ericlippert/archive/2009/02/02/properties-vs-attributes.aspx –