我正在尝试将所有硬编码字符串放在.cs文件中并从常量文件中加载它。
例如
string capital="Washington";
应该加载为
string capital=Constants.capital;
,将在Constants.cs中添加
public final const capital="Washington";
我需要一个java / C#代码段才能执行此操作。我无法使用任何第三方工具。对此有何帮助?
编辑:
在阅读了评论和答案之后,我感觉我并不清楚。我只是想要一种方法来替换所有硬编码的常量,这些常量将具有“”并将其撕掉并用常量替换它。并在Constants.cs.中添加该属性。这也可以是一个简单的文本处理。
答案 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)
我不知道是否有这样的代码可用,但我提供了一些如何实施的指南。
答案 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;
您可以将您的常量命名为非常具体。