Mam program C# regex-parsera z trzech plików w nim, z których każda zawiera statyczną klasę:Generowanie pliku T4, gdy pliki kodu samej klasy zostały zmodyfikowane
1) jedna klasa statyczna wypełnione słowników smyczkowych
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) Klasa, która zestawia te wartości do Regex
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) Niektóre kodu, który działa w oparciu o wyrażenia regularne tych ciągów:
public static class Parser
{
// heavily simplified example
public static GroupCollection SearchStringForStates(string str)
{
return Regex.Match(str,
"^" + Patterns.StateUS,
RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase).Groups;
}
}
Chciałbym być w stanie wygenerować 2) za pomocą szablonu T4, jak cały ten konkatenacji jest identyczna na każdym wykonania:
@"\b(?<STATE><#=CharTree.GenerateRegex(Enumerable.Union(
AddrVals.USstates.Keys,
AddrVals.USstates.Values)#>)\b";
To działa, ale jeśli tworzę nowy członek MyStringDicts
lub dodać/usunąć niektóre wartości ze swoich słowników, szablon T4 nie rozpozna ich, dopóki nie wykluczy Patterns.cs z kompilacji i rekompilacji. Ponieważ Parser
zależy od Patterns
, to naprawdę nie jest opcja - potrzebuję transformacji T4, aby uwzględnić zmiany w innych plikach w tej samej kompilacji.
Czego nie chcą rób:
- Podział
MyStringDicts
do własnego projektu. Chciałbym zachować pliki w jednym projekcie, ponieważ są one logiczną jednostką. - Po prostu przenieś
MyStringDicts
w górę Patterns.cs. Muszę członków MyStringDicts do innych celów, zbyt (dla wyszukiwań słownika, lub w innych szablonów T4, na przykład.)
I przyjął porady here temat korzystania T4Toolbox na VolatileAssembly
i takie, ale to wydaje się tylko pracować odwrotny kierunek, kiedy pliki klas muszą zostać rekompilowane po edycji szablonu T4.
Czy to jest możliwe? I?
edytowane dla jasności
Czy możesz wyjaśnić więcej o tym, dlaczego to robisz? Widzę kilka sposobów radzenia sobie z tym, ale trudno jest wiedzieć, który z nich jest odpowiedni w twoim scenariuszu bez jakiegoś tła. – AVee
Przy okazji, to są pomysły, które mam. Może podpowiedź jest wystarczająca, abyś mógł iść. Rozwiązanie dostarczone przez FuleSnabel prawdopodobnie zadziała, możesz też zrobić coś podobnego, używając rzeczy w przestrzeni nazw EnvDte. Ale może zrobi to coś prostszego. Możesz rozważyć umieszczenie klas, których potrzebujesz w T4 w oddzielnym projekcie i odniesienie do nich z szablonów. Można również dynamicznie kompilować i wykonywać kod, którego potrzebujesz dynamicznie w swoich szablonach T4. – AVee
@AVee dziękuję za zmuszenia mnie do robienia właściwych rzeczy i uwzględnienia mojej faktycznej sprawy. – Arithmomaniac