Замена жестко закодированных строк константами в C#

#c# #constants

#c# #константы

Вопрос:

Я пытаюсь взять все жестко закодированные строки в файле .cs и загрузить их из файла constant.

Например

 string capital="Washington";
  

должно быть загружено как

 string capital=Constants.capital;
  

и это будет добавлено в Constants.cs

 public final const capital="Washington";
  

Для этого мне нужен фрагмент java / C #.Я не могу использовать какие-либо сторонние инструменты.Любая помощь по этому поводу?

Редактировать:

После прочтения комментариев и ответов у меня возникает ощущение, что я чего-то не понимаю.Я просто хочу способ заменить все жестко закодированные константы, которые будут содержать «», и удалить это и заменить константами. и добавьте это свойство в Constants.cs.Это также может быть простой обработкой текста.

Комментарии:

1. Вы не можете создать файл ресурсов?

2. нет, я должен загрузить это из другого файла cs. Плохой разработчик, а не дизайнер 🙂

Ответ №1:

Несколько советов, которые помогут вам начать:

Предположим, что ваша функция обработки строк называется ProcessStrings .

1) Включите Constants.cs в тот же проект, что и функция ProcessStrings, чтобы она была скомпилирована вместе с кодом рефакторинга.

2) Поразмышляйте над своим классом Constants, чтобы создать словарь языковых строк с именами констант, что-то вроде:

 Dictionary<String, String> constantList = new Dictionary<String, String>();
FieldInfo[] fields = typeof(Constants).GetFields(BindingFlags.Static | BindingFlags.Public);
String constantValue;

foreach (FieldInfo field in fields)
{
    if (field.FieldType == typeof(String))
    {                    
        constantValue = (string)field.GetValue(null);             
        constantList.Add(constantValue, field.Name);
    }
}
  

3) Список констант теперь должен содержать полный список имен констант, индексированных по строке, которую они представляют.

4) Извлеките все строки из файла (используя File.Прочитайте все строки).

5) Теперь выполните итерацию по строкам. Что-то вроде следующего должно позволить вам игнорировать строки, которые вы не должны обрабатывать.

 //check if the line is a comment or xml comment
if (Regex.IsMatch(lines[idx], @"^s*//")) 
    continue;

//check if the entry is an attribute
if (Regex.IsMatch(lines[idx], @"^s*["))
    continue;

//check if the line is part of a block comment (assuming a * at the start of the line)
if (Regex.IsMatch(lines[idx], @"^s*(/* |* )"))
    continue;

//check if the line has been marked as ignored 
//(this is something handy I use to mark a string to be ignored for any reason, just put //IgnoreString at the end of the line)
if (Regex.IsMatch(lines[idx], @"//s*IgnoreStrings*$")) 
    continue;
  

6) Теперь сопоставьте любые строки, заключенные в кавычки, в строке, затем просмотрите каждое соответствие и проверьте его на несколько условий. Вы можете удалить некоторые из этих условий, если потребуется.

 MatchCollection mC = Regex.Matches(lines[idx], "@?"([^"] )"");

foreach (Match m in mC)
{                           

    if (            
        // Detect format insertion markers that are on their own and ignore them, 
        !Regex.IsMatch(m.Value, @"""s*{d(:d )?}s*""") amp;amp;
        //or check for strings of single character length that are not proper characters (-, /, etc)
        !Regex.IsMatch(m.Value, @"""s*\?[^w]s*""") amp;amp;
        //check for digit only strings, allowing for decimal places and an optional percentage or multiplier indicator
        !Regex.IsMatch(m.Value, @"""[d.] [%|x]?""") amp;amp;
        //check for array indexers
        !(m.Index <= lines[idx].Length amp;amp; lines[idx][m.Index - 1] == '[' amp;amp; lines[idx][m.Index   m.Length] == ']')  amp;amp;          
        )
    {
        String toCheck = m.Groups[1].Value;

        //look up the string we found in our list of constants
        if (constantList.ContainsKey(toCheck))
        {
            String replaceString;

            replaceString = "Constants."   constants[toCheck];              

            //replace the line in the file
            lines[idx] = lines[idx].Replace("""   m.Groups[1].Value   """, replaceString);
        }
        else
        {

            //See Point 8....

        }
    }
  

7) Теперь восстановите массив строк и запишите его обратно в файл. Это должно помочь вам пройти большую часть пути.

8) Чтобы заставить его генерировать константы для строк, для которых у вас еще нет записи, в блоке else для поиска строки сгенерируйте имя константы из строки (я просто удалил все специальные символы и пробелы из строки и ограничил ее 10 словами). Затем используйте это имя и исходную строку (из toCheck переменной в пункте 6), чтобы сделать объявление константы и вставить его в Constants.cs. Затем, когда вы снова запустите функцию, будут использоваться эти новые константы.

Комментарии:

1. блестяще, ты молодец. Есть только один голос, люблю иметь бота для голосования 🙂

Ответ №2:

Я не знаю, существует ли какой-либо подобный код, но я предоставляю некоторые рекомендации о том, как это можно реализовать.

  1. Вы можете написать макрос / автономное приложение (я думаю, что макрос — лучший вариант)
  2. Проанализируйте текущий документ или все файлы в проекте / решении
  3. Напишите регулярное выражение для поиска строк (как насчет строк в XAML?). что-то вроде [string]([a-z A-Z0-9])[«]([a-z A-Z0-9])[«][;] — это недопустимо, я просто предоставил для обсуждения
  4. Извлеките константу из кода.
  5. Проверьте, есть ли подобная строка уже в вашем статическом классе
  6. Если не найден, вставьте новую запись в статический класс
  7. Замените строку именем переменной
  8. Переходим к шагу 2

Ответ №3:

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

Комментарии:

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

Ответ №4:

 public const string capital = "Washington";
  

если const не работает в статическом классе, то это было бы

 public static readonly string capital = "Washington";
  

Ответ №5:

если вы действительно хотите сделать это так, как вы описываете, прочитайте файл с помощью streamreader, разделите на r n, проверьте, является ли первое «string», а затем выполните все ваши замены для этого элемента string … убедитесь, что каждый раз, когда вы изменяете это строковое объявление, вы добавляете необходимые строки в другой файл.

Ответ №6:

Вы можете создать проект класса для своих констант, или, если у вас есть проект вспомогательного класса, вы можете добавить новый класс для своих констант ( Constants.cs ).

 public static class Constants
{
   public const string CAPITAL_Washington = "Washington";
}
  

Теперь вы можете использовать это:

 string capital = Constants.CAPITAL_Washington;
  

Вы могли бы также назвать свои константы довольно конкретными.