При использовании ObsoleteAtribute в .Net он выдает предупреждения компилятора о том, что объект / метод / свойство устарели и следует использовать что-то еще. В настоящее время я работаю над проектом, который требует серьезного рефакторинга кода бывших сотрудников. Я хочу написать настраиваемый атрибут, который я могу использовать для маркировки методов или свойств, которые будут генерировать предупреждения компилятора, которые дают сообщения, которые я пишу. Что-то вроде этого
[MyAttribute("This code sux and should be looked at")]
public void DoEverything()
{
}
<MyAttribute("This code sux and should be looked at")>
Public Sub DoEverything()
End Sub
Я хочу, чтобы это вызвало предупреждение компилятора, в котором говорится: «Этот код sux, и на него следует обратить внимание». Я знаю, как создать настраиваемый атрибут, вопрос в том, как заставить его генерировать предупреждения компилятора в Visual Studio.
Ответы:
Обновить
Теперь это возможно с Roslyn (Visual Studio 2015). Вы можете построить на анализатор кода для проверки пользовательского атрибута
Я не верю, что это возможно. ObsoleteAttribute специально обрабатывается компилятором и определен в стандарте C #. Почему, черт возьми, ObsoleteAttribute неприемлемо? Мне кажется, что это именно та ситуация, для которой он был разработан, и дает именно то, что вам нужно!
Также обратите внимание, что Visual Studio также на лету принимает предупреждения, генерируемые ObsoleteAttribute, что очень полезно.
Не хочу быть бесполезным, просто удивляюсь, почему вы не хотите его использовать ...
К сожалению, ObsoleteAttribute запечатан (вероятно, отчасти из-за специальной обработки), поэтому вы не можете создать подкласс своего собственного атрибута из него.
Из стандарта C #: -
Разве это не подводит итог твоим потребностям? ... я не думаю, что ты добьешься большего успеха.
источник
[Obsolete]
тег заключается в том, что это может вызвать проблемы, если вам нужно выполнить XmlSerialization со свойством. Добавление[Obsolete]
тега также добавляет скрытый[XmlIgnore]
атрибут.Это стоит попробовать.
Вы не можете расширить Obsolete, потому что он окончательный, но, возможно, вы можете создать свой собственный атрибут и пометить этот класс как устаревший следующим образом:
Затем, когда вы помечаете свои методы атрибутом «MustRefactor», будут отображаться предупреждения компиляции. Он генерирует предупреждение во время компиляции, но сообщение об ошибке выглядит забавно, вы должны увидеть его сами и выбрать. Это очень близко к тому, чего вы хотели достичь.
ОБНОВЛЕНИЕ: с помощью этого кода генерируется предупреждение (не очень хорошо, но я не думаю, что есть что-то лучше).
источник
IDisposable
эти устаревшие классы, это означает, что вы можете заключить свой хитроумный тестовый код вusing
блок. Как это:using(new MustRefactor()){DodgyCode();}
. После этого вы сможете найти все способы использования. Я использую это прямо сейчас дляSleep
потока внутри цикла for, который мне нужно искусственно замедлить в целях отладки.В некоторых компиляторах вы можете использовать #warning для вывода предупреждения:
В компиляторах Microsoft вы обычно можете использовать прагму message:
Вы упомянули .Net, но не указали, программируете ли вы на C / C ++ или C #. Если вы программируете на C #, вам следует знать, что C # поддерживает формат #warning .
источник
В настоящее время мы находимся в процессе большого объема рефакторинга, в результате которого мы не могли исправить все сразу. Мы просто используем команду #warning preproc, где нам нужно вернуться и посмотреть код. Он отображается в выводе компилятора. Я не думаю, что вы можете поместить это в метод, но вы можете поместить его просто внутри метода, и его все равно легко найти.
источник
В VS 2008 (+ sp1) # предупреждения не отображаются должным образом в списке ошибок после Clean Soultion & Rebuild Solution, не все из них. Некоторые предупреждения отображаются в списке ошибок только после открытия файла определенного класса. Поэтому мне пришлось использовать настраиваемый атрибут:
Поэтому, когда я помечаю им код
Он выдает такие предупреждения:
Я не могу изменить текст предупреждения, «Некоторые комментарии» не отображаются в списке ошибок. Но он переместится в нужное место в файле. Поэтому, если вам нужно изменить такие предупреждающие сообщения, создайте различные атрибуты.
источник
Вы пытаетесь неправильно использовать атрибуты. Вместо этого используйте список задач Visual Studio. Вы можете ввести комментарий в свой код следующим образом:
Затем откройте в меню Просмотр / Список задач. В списке задач есть две категории: задачи пользователя и комментарии. Переключитесь на Комментарии, и вы увидите все свои // Todo: там. Двойной щелчок по TODO приведет к переходу к комментарию в вашем коде.
Al
источник
Я не думаю, что ты сможешь. Насколько мне известно, поддержка ObsoleteAttribute по сути жестко встроена в компилятор C #; вы не можете делать ничего подобного напрямую.
Что вы могли бы сделать, так это использовать задачу MSBuild (или событие после сборки), которая запускает настраиваемый инструмент для только что скомпилированной сборки. Пользовательский инструмент будет отражать все типы / методы в сборке и использовать ваш настраиваемый атрибут, после чего он может печатать в System.Console по умолчанию или в TextWriters с ошибкой.
источник
Глядя на источник ObsoleteAttribute , не похоже, что он делает что-то особенное для генерации предупреждения компилятора, поэтому я бы предпочел использовать @ technophile и сказать, что он жестко встроен в компилятор. Есть ли причина, по которой вы не хотите просто использовать ObsoleteAttribute для создания предупреждающих сообщений?
источник
Есть несколько комментариев, предлагающих вставить предупреждения или прагму. Устаревшее работает совсем по-другому! Отмечая устаревшую функцию библиотеки L, сообщение об устаревшем появляется, когда программа вызывает функцию, даже если вызывающая программа не находится в библиотеке L. Предупреждение выводит сообщение ТОЛЬКО при компиляции L.
источник
Вот реализация Roslyn, поэтому вы можете создавать свои собственные атрибуты, которые выдают предупреждения или ошибки на лету.
Я создал атрибут Type Called,
IdeMessage
который будет атрибутом, который генерирует предупреждения:Для этого вам необходимо сначала установить Roslyn SDK и запустить новый проект VSIX с анализатором. Я пропустил некоторые менее важные части, такие как сообщения, вы можете понять, как это сделать. В вашем анализаторе вы делаете это
CodeFixProvider для этого отсутствует, вы можете удалить его из решения.
источник