Ho un programma C# regex-parser con tre file in essa contenuti, ciascuno contenente una classe statica:Genera file T4 quando i file di codice stessa classe sono stati modificati
1) una classe statica pieno di dizionari stringa
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) Una classe che compila questi valori in 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) del codice che gestisce le espressioni regolari sulla base di queste stringhe:
public static class Parser
{
// heavily simplified example
public static GroupCollection SearchStringForStates(string str)
{
return Regex.Match(str,
"^" + Patterns.StateUS,
RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase).Groups;
}
}
Mi piacerebbe essere in grado di generare 2) come con un modello T4, come tutto questo concatenamento è identico su ogni esecuzione:
@"\b(?<STATE><#=CharTree.GenerateRegex(Enumerable.Union(
AddrVals.USstates.Keys,
AddrVals.USstates.Values)#>)\b";
Questo funziona, ma se creo un nuovo membro di MyStringDicts
o aggiungere/rimuovere alcuni valori dai suoi dizionari, il modello T4 non li riconoscerà fino a escludere Patterns.cs dalla compilazione e ricompilare. Dato che Parser
dipende da Patterns
, questa non è davvero un'opzione: ho bisogno della trasformazione T4 per prendere in considerazione le modifiche ad altri file nella stessa build.
Le cose che non voglio fare fare:
- Split
MyStringDicts
in un proprio progetto. Mi piacerebbe mantenere i file in un progetto, in quanto sono un'unità logica. - Basta spostare
MyStringDicts
nella parte superiore di Patterns.cs. Ho bisogno i membri MyStringDicts per altri scopi, anche (per le ricerche del dizionario, o in altri modelli T4, per esempio.)
ho adottato il consiglio here sull'utilizzo di T4Toolbox VolatileAssembly
e simili, ma che sembra funzionare solo per la direzione inversa, quando i file di classe devono essere ricompilati dopo aver modificato il modello T4.
È ciò che I desidera possibile?
modificati per chiarezza
Puoi spiegare un po 'di più sul perché lo stai facendo? Riesco a vedere diversi modi per affrontare questo problema, ma è piuttosto difficile sapere quale sia adatto nel tuo scenario senza qualche background. – AVee
Btw, queste sono le idee che ho. Forse il suggerimento è sufficiente per farti andare. Probabilmente la soluzione fornita da FuleSnabel funzionerà, potresti anche fare qualcosa di simile usando lo spazio dei nomi di EnvDte. Ma forse qualcosa di più semplice farà. Potresti prendere in considerazione la possibilità di inserire le classi di cui hai bisogno in T4 in un progetto separato e solo facendo riferimento ai modelli. È anche possibile compilare e eseguire dinamicamente il codice necessario dinamicamente all'interno dei modelli T4. – AVee
@AVee grazie per avermi costretto a fare la cosa giusta e includere il mio caso reale. – Arithmomaniac