Как я могу потребовать атрибута на определении класса?

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

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

Есть что-то такое?

6
задан spoulson 24 May 2010 в 17:26
поделиться

2 ответа

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

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

6
ответ дан 17 December 2019 в 00:04
поделиться

Это возможно во время выполнения через 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") на нем, чтобы убедиться, что он выполняется только в режиме DEBUG.
(Потому что Reflection работает не быстро, и действительно не имеет смысла запускать это в производственном режиме, не так ли?)

1
ответ дан 17 December 2019 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: