3つのファイルを含むC#regex-parserプログラムがあり、それぞれに静的クラスが含まれています。
1)文字列辞書で満たされた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
か、辞書からいくつかの値を追加/削除すると、Patterns.csをコンパイルから除外して再コンパイルするまで、T4テンプレートはそれらを認識しません。Parser
に依存するように、Patterns
これは実際にはオプションではありません。同じビルド内の他のファイルへの変更を考慮に入れるには、T4変換が必要です。
やりたくないこと:
MyStringDicts
独自のプロジェクトに分割します。ファイルは論理的な単位であるため、1つのプロジェクトに保存したいと思います。MyStringDicts
Patterns.csの一番上に移動するだけです。MyStringDictsメンバーは、他の目的にも必要です(たとえば、辞書検索や他のT4テンプレートなど)。
ここでは、T4Toolboxなどの使用に関するアドバイスを採用しましたVolatileAssembly
が、T4テンプレートの編集後にクラスファイルを再コンパイルする必要がある場合は、逆方向にしか機能しないようです。
私が欲しいことは可能ですか?
わかりやすくするために編集