Пользовательское правило FxCop для реализации CA2241 для строки.Форматирование с использованием строкового ресурса?

#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 файла ресурсов, имя имени ресурса и фактическое значение ресурса.

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

И, наконец, во многих условиях перевода файлы ресурсов создаются во время разработки только на одном языке, а переводы компилируются и добавляются в продукт на более позднем этапе…

Все, что сказано, должно быть возможно. найти содержимое сложно, но фактическое правило затем можно скопировать из существующего кода.