У меня есть пара классов, которые я хочу отметить определенным атрибутом. У меня есть два подхода. Один из них включает использование класса, расширяющего атрибуты. Другой использует пустой интерфейс:Интерфейсы или атрибуты для меток классов?
Атрибуты
public class FoodAttribute : Attribute { }
[Food]
public class Pizza { /* ... */ }
[Food]
public class Pancake { /* ... */ }
if (obj.IsDefined(typeof(FoodAttribute), false)) { /* ... */ }
Интерфейс
public interface IFoodTag { }
public class Pizza : IFoodTag { /* ... */ }
public class Pancake : IFoodTag { /* ... */ }
if (obj is IFoodTag) { /* ... */ }
Я не решаются использовать атрибуты в связи с его использованием Reflection. В то же время, однако, я не решаюсь создать пустой интерфейс, который действительно служит только тегом. Я испытывал стресс-тестирование, и разница во времени между ними составляет всего около трех миллисекунд, поэтому производительность здесь не поставлена.
просто интересно, что вы делаете, если объект является пищей? если интерфейс IFood пуст, для чего вы их различаете? ... – serhio
Если объект является продуктом питания, я бы возвратил FoodEventArguments. Если бы объект был, скажем, Beverage, я бы возвратил DrinkEventArguments. В принципе, есть общий базовый класс (скажем ConcessionStandItem), который передается в функцию. – Scott
См. Также: http://blogs.msdn.com/ericlippert/archive/2009/02/02/properties-vs-attributes.aspx –