Перевірте, чи має клас атрибут?


101

Я намагаюся зробити невелику розробку Test-First, і я намагаюся переконатися, що мої класи позначені атрибутом:

[SubControllerActionToViewDataAttribute]
public class ScheduleController : Controller

Як перевірити, чи є клас присвоєний йому атрибутом?

Відповіді:


123

перевірити це

Attribute.GetCustomAttribute(typeof(ScheduleController),
    typeof(SubControllerActionToViewDataAttribute))

не є нульовим ( Assert.IsNotNullабо подібним)

(тому я скоріше використовую це, ніж IsDefinedте, що більшість разів мені теж хочеться перевірити деякі властивості атрибута ....)


6
лише перевірити, чи присутній атрибут, який, як правило, все, що потрібно для атрибутів без параметрів / без властивостей, використовувати дешевше.
— Лассе В. Карлсен

1
Що стосується того, що IsDefined буде дешевшим ... але в більшості випадків (і зокрема тестів з одиницями) ви навряд чи помітите різницю. Можливо, якщо б це був жорсткий цикл у виробничому коді ...
— Марк Гравелл

@ Марк - Я погоджуюсь, що різниця в продуктивності, ймовірно, не помітна в одиничному тесті. Я отримав би атрибут, якщо мені потрібно його використовувати, що, як ви кажете, є сценарієм у більшості випадків. Нещодавно я використовував IsDefined в рамках, про який писав, щоб виключити стовпчик у спадному полі сортувальних полів - це спрацювало добре, тому що мені не потрібно було використовувати сам атрибут.
— РічардОД

Як ми можемо перевірити те саме для методу?
— Манвіндер Сінгх

80

Те саме, що ви зазвичай перевіряли на атрибут класу.

Ось приклад коду.

typeof(ScheduleController)
.IsDefined(typeof(SubControllerActionToViewDataAttribute), false);

Я думаю, що в багатьох випадках тестування на наявність атрибуту в одиничному тесті є неправильним. Оскільки я не використовував функцію допоміжного контролера MVC contrib, я не можу коментувати, чи підходить він у цьому випадку.


Зробив +1, а потім помітив помилку. Він повинен бути .IsDefined (typeof (Type), false);
— Олександр Білецький

@alexanderb ти, звичайно, маєш рацію. Зараз я оновив свою відповідь. Я повинен не перевіряв свою відповідь проти компілятора в той час! Дякуємо, що
— вказали

10
такий підхід швидший, ніж попередній
— Слава

18

Для цього також можна використовувати дженерики:

var type = typeof(SomeType);
var attribute = type.GetCustomAttribute<SomeAttribute>();

Таким чином вам не потрібен інший typeof(...), який може зробити код чистішим.


Це не працює для мене. Якого using.. я пропускаю?

@Scanzy Я не впевнений, ти не використовуєш IDE? (Зазвичай вони підказують правильне using) Яку помилку ви отримуєте?
— Кролтан

1
ОК, тут я знайшов GetCustomAttribute<SomeAttribute>метод доступний з .NET 4.5, і для моєї IDE встановлено 3,5, тому все зрозуміло зараз

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.