Пользовательские атрибуты на интерфейсах или классы, которые их реализуют?

StackOverflow https://stackoverflow.com/questions/438913

  •  22-07-2019
  •  | 
  •  

Вопрос

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

Обновление . В основном я пишу собственный механизм хранения данных для проекта, а объекты представляют различные хранимые таблицы. Пользовательский атрибут используется для указания того, какая таблица в наборе данных используется для хранения объектов этого класса, а также для определения того, какие таблицы участвуют в отношении n: m.

Итак, если я добавлю атрибуты в интерфейс, это более понятный подход или он загромождает интерфейс и делает доступ к самим данным более громоздким?

Это было полезно?

Решение

Это зависит от сценария. WCF, например, украшает интерфейсы для контрактов операций.

Однако, если вы собираетесь говорить об объектах (а не о самом интерфейсе), обратите внимание, что вызов кода может быть болезненным для получения метаданных интерфейса, особенно если класс использует явная реализация интерфейса.

Было бы более обычным украшать класс, но это не совсем тот же вопрос ;-p

Если атрибут действительно специфичен для интерфейса (не для экземпляров), тогда хорошо - украсьте интерфейс и поговорите о typeof (IFoo) и т. д. Но если вы ожидайте, что код сможет устанавливать значения для каждого типа для атрибутов, он должен быть на уровне класса.

Какой сценарий?

Другие советы

Ну, это зависит от того, имеет ли интерфейс какое-либо отношение к метаданным.

interface IRunnable
{
    void Run();
}

class Test : IRunnable
{
    public void Run() { }
}

В этом примере имеет смысл поместить атрибуты в интерфейс, если они относятся к цели интерфейса. Если атрибуты применимы ко всем реализациям, поместите атрибуты в интерфейс.

Однако, если атрибуты не имеют ничего общего с " выполнением " (с «runnability», относящимся к IRunnable , а не к CLR) класса, затем поместите атрибуты в класс.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top