Генерировать файл T4, когда те же -файлы кода класса были изменены

У меня есть программа-парсер 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.

Возможно ли то, что я хочу?

отредактировано для ясности

7
задан Community 23 May 2017 в 10:28
поделиться