У меня есть пара классов, которые я хочу пометить определенным атрибутом. Я имею в виду два подхода. Один включает использование класса, расширяющего атрибуты. Другой использует пустой интерфейс:
Атрибуты
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. В то же время, однако, я не решаюсь создать пустой интерфейс, который действительно служит только тегом. Я проверил оба стресс-теста, и разница во времени между ними составляет всего около трех миллисекунд, поэтому производительность здесь не ставится