#c# #resources #localization #fxcop #string.format
#c# #Ресурсы #локализация #fxcop #string.format
Вопрос:
CA2241: предоставление правильных аргументов методам форматирования отлично работает, если вы не используете строковые ресурсы для аргумента format string .
Кто-нибудь знает о пользовательском правиле, которое делает то же самое для String .Вызовы Format, которые используют ресурс для строкового формата?
Например, вместо этого (какое правило CC2241 помечает):
String.Format( "{0} {1}", value );
Мне нужно правило, которое обнаруживает проблему с ресурсами.MessageWithTwoPlaceholders — это ресурс, определенный как «{0} {1}».
String.Format( Resources.MessageWithTwoPlaceholders, arg );
Я взглянул на написание пользовательского правила для обработки этого, и оно выглядит выполнимым, но требует довольно значительных усилий.
Комментарии:
1. Я написал свою долю пользовательских правил FxCop, и это выглядит так, как будто было бы очень сложно написать.
2. Так что, возможно, это было (в двух словах)… 1) изучите инструкции, чтобы найти вызовы string.format, 2) вернитесь назад и найдите первый аргумент, 3) если он кажется ресурсом, извлеките ресурс … что, я уверен, гораздо сложнее, чем кажется. Похоже, это такая частая необходимость, что я раздражен, что MS не предоставила ее.
3. Это, а также для получения дополнительной информации, извлеките ресурс для каждой локали и убедитесь, что все они имеют одинаковое количество заполнителей.
4. Учитывая, что ресурсы не являются константами времени компиляции, я не понимаю, как вы можете выполнять для них полезный статический анализ? Похоже, что-то, что должно быть обнаружено в модульных тестах.
5. Я пытаюсь это сделать, но столкнулся с небольшой проблемой поиска первого аргумента для вызова. Доступен ли источник для встроенного правила CC2241? Я могу легко отступить, как только нажму на вызов, но это становится немного сложнее, когда параметры являются вызовами других методов.
Ответ №1:
Проблема с этим типом правил заключается в том, что строка формата может быть неправильной в нескольких сборках, и не обязательно в анализируемой сборке.
Что делает это еще сложнее, так это то, что вы загружаете ресурс не из диспетчера ресурсов, а из сгенерированного класса ресурсов, который абстрагирует nae файла ресурсов, имя имени ресурса и фактическое значение ресурса.
Еще одна проблема, с которой вы столкнетесь, заключается в том, что загрузка данных ресурса в память, вероятно, потребует от вас фактической загрузки сборки по-настоящему, а не просто самоанализа, если вы не хотите самостоятельно анализировать ресурс.
И, наконец, во многих условиях перевода файлы ресурсов создаются во время разработки только на одном языке, а переводы компилируются и добавляются в продукт на более позднем этапе…
Все, что сказано, должно быть возможно. найти содержимое сложно, но фактическое правило затем можно скопировать из существующего кода.