У меня есть программа-парсер C #regex -с тремя файлами, каждый из которых содержит статический класс:
1 )один статический класс, заполненный строковыми словарями
static class MyStringDicts
{
internal static readonly Dictionary USstates =
new Dictionary()
{
{ "ALABAMA", "AL" },
{ "ALASKA", "AK" },
{ "AMERICAN SAMOA", "AS" },
{ "ARIZONA", "AZ" },
{ "ARKANSAS", "AR" }
// and so on
}
// and some other dictionaries
}
2 )Класс, который компилирует эти значения в Regex
public static class Patterns
{
Public static readonly string StateUS =
@"\b(?" + 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;
}
}
Я хотел бы иметь возможность генерировать 2 ), как с шаблоном T4, поскольку вся эта конкатенация одинакова при каждом выполнении :
@"\b(?<#=CharTree.GenerateRegex(Enumerable.Union(
AddrVals.USstates.Keys,
AddrVals.USstates.Values)#>)\b";
. Это работает, но если я создам новый член MyStringDicts
или добавлю/удалю некоторые значения из его словарей, шаблон T4 не распознает их, пока не исключит Patterns.cs из компиляции и не перекомпилирует. Поскольку Parser
зависит от Patterns
, это действительно не вариант. -Мне нужно преобразование T4, чтобы учесть изменения в других файлах в той же сборке.
Вещи, которые я не хочу делать:
MyStringDicts
на отдельный проект. Я хотел бы сохранить файлы в одном проекте, так как они являются логической единицей.MyStringDicts
в верхнюю часть Patterns.cs. Члены MyStringDicts нужны мне и для других целей, (для поиска в словаре или, например, в других шаблонах T4.)Я принял совет здесь об использовании T4Toolbox VolatileAssembly
и тому подобное, но, похоже, это работает только в обратном направлении, когда файлы классов необходимо перекомпилировать после редактирования шаблона T4.
Возможно ли то, что я хочу?
отредактировано для ясности