c# - studio - Interfaces o atributos para etiquetar clases
generar documentacion visual studio 2017 (4)
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 usa una interfaz vacía:
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) { /* ... */ }
Dudo en usar los atributos debido a su uso de Reflection. 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í.
Bueno, con los atributos, siempre puedes crear el atributo de tal manera que su función no se propague automáticamente a los tipos descendientes.
Con las interfaces, eso no es posible.
Yo iría con atributos.
En este caso, como dices, no estás utilizando una interfaz correctamente.
¿Qué hay de malo con el uso de los atributos de obtener reflejo? La respuesta habitual es el rendimiento, pero en general no es un problema real en casi todos los casos.
Probablemente hayas respondido tu pregunta por tu cuenta. Atributos es más lógico aquí, la reflexión no es un GRAN MONSTRUO CON OJOS ROJOS =)
Por cierto, ¿puedes mostrar el código de llamada, donde determinas marcado con tipos de interfaz? ¿No estás usando la reflexión allí?
Tendré que decir lo contrario. Creo que, para su ejemplo , una interfaz de marcador tiene más sentido.
Eso es porque parece muy probable que algún día puedas agregar algunos miembros a IFood
.
Tu diseño comienza así:
interface IFood {}
Pero luego decides agregar algo allí:
interface IFood {
int Calories { get; }
}
También hay otras formas de ampliar las interfaces:
static class FoodExtensions {
public static void Lighten(this IFood self) {
self.Calories /= 2;
}
}