Stylecop - есть ли класс x в моей иерархии наследования? - PullRequest
2 голосов
/ 03 марта 2011

Есть ли способ проверить, имеет ли мой элемент с классом elementtype некоторый другой класс в его иерархии наследования?

Мой пример использования: я должен проверить, имеет ли мой Исключения префикс «Исключение». Для этого мне нужно как-то определить, является ли определенный класс исключением. Единственный способ убедиться, что он унаследован самим классом Exception.

Проверка типа базового класса на исключение достаточно проста, но представьте себе следующий сценарий:

class GenericMathException : Exception{}
class SpecificMathException : GenericMathException{}

Единственная информация, которую я могу получить о SpecificMathException, это то, что его тип базового класса равен GenericMathException, но я не могу идти дальше в его иерархии наследования.

Обычный подход к отражению тоже нельзя использовать, афаик.

Так, кому-нибудь приходилось иметь дело с этой проблемой и находить решение? Или есть какой-нибудь альтернативный подход для выявления исключений?

Заранее спасибо.

1 Ответ

0 голосов
/ 03 марта 2011

По своей природе StyleCop действительно работает только с содержимым файла и не может использовать информацию из самой сборки.

Но, если вы спросите об "альтернативном подходе для определения исключений", естьправило в StyleCop + , которое выполняет проверку очень близко к вашей.Вы указываете список базовых классов (Attribute, Exception, EventArgs и Stream по умолчанию), и это гарантирует, что все классы, унаследованные от них, имеют имя, которое заканчивается на ...Attribute, ...Exception ии т. д.

Проверка работает следующим образом.Если имя базового класса заканчивается строкой из списка, это гарантирует, что имя унаследованного класса также должно заканчиваться той же строкой.Например, если он встречает Class2 : InvalidOperationException или Class2 : SomeUnknownException, это вызовет нарушение в обоих случаях.

Если вы будете следовать этому правилу, все ваши унаследованные классы всегда будут иметь правильные имена, даже если они являются множественными-inherited.Единственное, что не может быть проверено таким образом, - это ситуация, когда вы имеете дело с некоторыми классами не из «вашей» сборки, которые уже нарушили это правило.Например, если какая-то сборка имеет Class2 : Exception, и вы ссылаетесь на эту сборку как на двоичный файл (и у вас нет возможности проверить его с помощью StyleCop), то вы не сможете проверить, должен ли ваш Class3 унаследованный от Class2иметь префикс ...Exception.

Но практика показывает, что последняя проблема встречается довольно редко, поэтому описанный выше метод очень хорошо работает для StyleCop.

...