用C#中的常量替换硬编码字符串

时间:2011-05-06 05:23:26

标签: c# constants

我正在尝试将所有硬编码字符串放在.cs文件中并从常量文件中加载它。

例如

string capital="Washington";

应该加载为

string capital=Constants.capital;

,将在Constants.cs中添加

public final const capital="Washington";

我需要一个java / C#代码段才能执行此操作。我无法使用任何第三方工具。对此有何帮助?

编辑:

在阅读了评论和答案之后,我感觉我并不清楚。我只是想要一种方法来替换所有硬编码的常量,这些常量将具有“”并将其撕掉并用常量替换它。并在Constants.cs.中添加该属性。这也可以是一个简单的文本处理。

6 个答案:

答案 0 :(得分:2)

一些可以帮助你入门的提示:

假设您的字符串处理器函数名为ProcessStrings。

1)将Constants.cs包含在与ProcessStrings函数相同的项目中,因此它将使用重构代码进行编译。

2)反思你的Constants类,将语言字符串的Dictionary建立为常量名,如:

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)constantList现在应该包含Constant名称的完整列表,由它们代表的字符串索引。

4)抓取文件中的所有行(使用File.ReadAllLines)。

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*IgnoreString\s*$")) 
    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*""") &&
        //or check for strings of single character length that are not proper characters (-, /, etc)
        !Regex.IsMatch(m.Value, @"""\s*\\?[^\w]\s*""") &&
        //check for digit only strings, allowing for decimal places and an optional percentage or multiplier indicator
        !Regex.IsMatch(m.Value, @"""[\d.]+[%|x]?""") &&
        //check for array indexers
        !(m.Index <= lines[idx].Length && lines[idx][m.Index - 1] == '[' && lines[idx][m.Index + m.Length] == ']')  &&          
        )
    {
        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个单词)。然后使用该名称和原始字符串(来自第6点中的toCheck变量)进行常量声明并将其插入到Constants.cs中。    然后,当您再次运行该函数时,将使用这些新常量。

答案 1 :(得分:1)

我不知道是否有这样的代码可用,但我提供了一些如何实施的指南。

  1. 您可以编写宏/独立应用程序(我认为宏是更好的选择)
  2. 解析当前文档或项目/解决方案中的所有文件
  3. 编写一个正则表达式来查找字符串(XAML中的字符串是什么?)。类似[string]([az A-Z0-9] )[“]([az A-Z0-9] )[”] [;] - 这是无效的,我有只是提供讨论
  4. 从代码中提取常量。
  5. 检查静态类中是否存在类似的字符串
  6. 如果未找到,请在静态类
  7. 中插入新条目
  8. 用变量名称替换字符串
  9. 转到第2步

答案 2 :(得分:0)

您是否有理由不将这些内容放入静态类或仅放在应用程序的文件中?您可以将常量放在任何位置,只要它们的范围正确,您就可以从任何地方访问它们。

答案 3 :(得分:0)

public const string capital = "Washington";

如果const在静态类中不起作用,那么它将是

public static readonly string capital = "Washington";

答案 4 :(得分:0)

如果您真的想按照描述的方式进行操作,请使用streamreader读取文件,按\ r \ n分割,检查第一个是“string”,然后对该字符串元素进行所有替换。 .. 确保每次更改该字符串声明时,都将nessesary行添加到另一个文件中。

答案 5 :(得分:0)

您可以为常量创建一个类项目,或者如果您有一个辅助类项目,您可以为常量添加一个新类(Constants.cs)。

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

您现在可以使用它:

string capital = Constants.CAPITAL_Washington;

您可以将您的常量命名为非常具体。