Интерфейсы или атрибуты для маркировки классов? - PullRequest
17 голосов
/ 14 января 2010

У меня есть пара классов, которые я хочу пометить определенным атрибутом. Я имею в виду два подхода. Один включает использование класса, расширяющего атрибуты. Другой использует пустой интерфейс:

Атрибуты

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

Ответы [ 4 ]

15 голосов
/ 14 января 2010

Ну, с атрибутами, вы всегда можете создать атрибут таким образом, чтобы его функция не распространялась на потомки автоматически.

С интерфейсами это невозможно.

Я бы пошел с атрибутами.

7 голосов
/ 08 августа 2010

Я должен сказать иначе. Я думаю, что для вашего примера , интерфейс маркера имеет больше смысла.

Это потому, что весьма вероятно вероятно , что вы можете однажды добавить некоторых членов к IFood.

Ваш дизайн начинается так:

interface IFood {}

Но тогда вы решаете добавить что-то туда:

interface IFood {
  int Calories { get; }
}

Есть также другие способы для расширения интерфейсов:

static class FoodExtensions {
  public static void Lighten(this IFood self) { 
    self.Calories /= 2;
  } 
}
5 голосов
/ 14 января 2010

Вы, вероятно, ответили на свой вопрос самостоятельно. Атрибуты здесь более логичны, отражение - это НЕ БОЛЬШОЙ МОНСТР С КРАСНЫМИ ГЛАЗАМИ =)

Кстати, вы можете показать код вызова, где вы определяете помеченные с типами интерфейса? Разве вы не используете отражение там?

0 голосов
/ 14 января 2010

В этом случае, как вы говорите, вы неправильно используете интерфейс.

Что не так с использованием отражения получить атрибуты? Обычный ответ - производительность, но это, как правило, не является реальной проблемой почти во всех случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...