我有一个 C# 正则表达式解析器程序,其中包含三个文件,每个文件都包含一个静态类:
1) 一个用字符串字典填充的静态类
static class MyStringDicts
{
internal static readonly Dictionary<string, string> USstates =
new Dictionary<string, string>()
{
{ "ALABAMA", "AL" },
{ "ALASKA", "AK" },
{ "AMERICAN SAMOA", "AS" },
{ "ARIZONA", "AZ" },
{ "ARKANSAS", "AR" }
// and so on
}
// and some other dictionaries
}
2) 将这些值编译成正则表达式的类
public static class Patterns
{
Public static readonly string StateUS =
@"\b(?<STATE>" + CharTree.GenerateRegex(Enumerable.Union(
AddrVals.USstates.Keys,
AddrVals.USstates.Values))
+ @")\b";
//and some more like these
}
3)一些基于这些字符串运行正则表达式的代码:
public static class Parser
{
// heavily simplified example
public static GroupCollection SearchStringForStates(string str)
{
return Regex.Match(str,
"^" + Patterns.StateUS,
RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase).Groups;
}
}
我希望能够像 T4 模板一样生成 2),因为所有这些连接在每次执行时都是相同的:
@"\b(?<STATE><#=CharTree.GenerateRegex(Enumerable.Union(
AddrVals.USstates.Keys,
AddrVals.USstates.Values)#>)\b";
这可行,但如果我创建 的新成员MyStringDicts
,或从其字典中添加/删除某些值,则 T4 模板将无法识别它们,直到从编译和重新编译中排除 Patterns.cs。视情况而Parser
定Patterns
,这确实不是一个选项 - 我需要 T4 转换来考虑对同一构建中其他文件的更改。
我不想做的事情:
- 拆分
MyStringDicts
成自己的项目。我想将文件保存在一个项目中,因为它们是一个逻辑单元。 - 只需移动
MyStringDicts
到 Patterns.cs 的顶部。我还需要将 MyStringDicts 成员用于其他目的(例如,用于字典查找或其他 T4 模板。)
我在这里采纳了关于使用 T4ToolboxVolatileAssembly
等的建议,但这似乎只适用于相反的方向,即在编辑 T4 模板后需要重新编译类文件时。
我想要的可能吗?
为清楚起见进行了编辑