Как я могу требовать атрибут в определении класса? - PullRequest
6 голосов
/ 24 мая 2010

Есть ли способ применить требование компиляции для определенных атрибутов в реализации класса или интерфейса?

Например, допустим, мое приложение использует серию статических классов, которые содержат const int значения ресурсов. Я хотел бы украсить класс в атрибуте Description, чтобы описать его содержимое. В принципе, я хотел бы применить это требование атрибута к интерфейсу, тогда каждый статический класс будет реализовывать его с требуемым Description. Я мог бы написать проверку во время выполнения или модульный тест для проверки соответствия. Но на самом деле проверка во время компиляции была бы лучшей.

Есть ли такая вещь?

Ответы [ 2 ]

6 голосов
/ 24 мая 2010

Нет, ничего такого нет. Насколько мне известно, юнит-тесты - лучшее, что вы можете сделать.

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

1 голос
/ 24 мая 2010

Это возможно во время выполнения через Reflection.

Вот метод модульного теста для вас:

...
using System.Reflection;
using System.Diagnostics;
using System.Linq;
...

[TestMethod]
public void CheckAttributes()
{
    var notAttributed = Assembly.GetAssembly(typeof(SomeClass))
        .GetTypes()
        .Where(t => t.GetCustomAttributes(typeof(MyAttribute), true).Count() == 0);

    Assert.AreEqual<int>(0, notAttributed.Count());
}

Где MyAttribute - это тип вашего атрибута, а SomeClass - это класс в сборке, которую вы хотите проверить.
Вы также можете отфильтровать типы, которые вы хотите проверить таким образом. (Конечно, только если вам не требуется, чтобы каждый класс в сборке использовал этот атрибут.)


Если вы хотите сделать это в рабочем коде, поместите в него атрибут Conditional("DEBUG"), чтобы убедиться, что он выполняется только в режиме отладки.
(Потому что Reflection не быстрый, и запускать его в производственном режиме не имеет смысла, не так ли?)

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