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


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.