Как утверждать, что класс имеет унаследованный атрибут, но одновременно исключает родительский класс? - PullRequest
2 голосов
/ 02 июня 2010

У меня есть два атрибута - MigrationAttribute и TestDataMigrationAttribute : MigrationAttribute. Как я могу утверждать, что класс применил TestDataMigrationAttribute , но не MigrationAttribute (который является родительским атрибутом класса)?

Ответы [ 2 ]

0 голосов
/ 02 июня 2010
  object[] attributes = typeof(MyTestClass).GetCustomAttributes(typeof(MigrationAttribute), true);
  Assert.IsNotNull(attributes);
  Assert.IsTrue(attributes.Any(x => x is TestDataMigrationAttribute));
  Assert.IsFalse(attributes.Any(x => x is MigrationAttribute && !(x is TestDataMigrationAttribute)));

(при условии, что вы можете определить оба атрибута в классе)

0 голосов
/ 02 июня 2010

Если вы хотите проверить TestDataMigrationAttribute, убедитесь, что вы указали его явный тип при использовании Type.GetCustomAttributes():

typeof(MyClass).GetCustomAttributes(typeof(TestDataMigrationAttribute));

GetCustomAttributes возвращает атрибуты, которые являются или получены из указанного типа атрибута. Если вы используете тип производного атрибута (TestDataMigrationAttribute), вы не найдете базовый атрибут (MigrationAttribute). Если вы используете тип базового атрибута, вы найдете оба атрибута.

Приведенный выше пример вернет атрибут, только если [TestDataMigration] отмечен в классе, а не если [Migration] находится в классе.

Если вам нужно проверить случай, когда оба атрибута могут быть определены в классе, но вы хотите, чтобы классы имели только [TestDataMigration], то вам придется либо проверить базовый тип атрибута, и проанализировать полученный массив или выполните проверку дважды - один раз для каждого типа атрибута.

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