Существует ли способ осуществить требование компиляции для определенных атрибутов на классе или интерфейсной реализации?
Например, скажем, мое приложение использует серию статических классов, которые содержат const int
значения ресурса. Я хотел бы украсить класс в a Description
атрибут для описания его содержания. В понятии я хотел бы применить это требование атрибута к интерфейсу, затем каждый статический класс реализует его со своим необходимым Description
. Я мог записать проверку на этапе выполнения или модульный тест для проверения соответствия. Но действительно проверка времени компиляции была бы лучшей.
Есть что-то такое?
Нет, ничего подобного нет. Насколько мне известно, юнит-тесты - лучшее, что вы можете сделать.
Если вы можете идентифицировать классы автоматически (по имени или какому-либо другому атрибуту, которым этот класс украшен), вы можете легко написать модульный тест для всех классов в сборке.
Это возможно во время выполнения через 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 работает не быстро, и действительно не имеет смысла запускать это в производственном режиме, не так ли?)