tôi có một chương trình C# regex-phân tích cú pháp với ba tác phẩm trong đó, mỗi dòng chứa một lớp tĩnh:Tạo tập tin T4 khi file mã cùng lớp đã được sửa đổi
1) một lớp tĩnh đầy tự điển chuỗi
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) Một lớp học mà biên dịch các giá trị vào 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) một số mã chạy biểu thức thông thường dựa trên những chuỗi:
public static class Parser
{
// heavily simplified example
public static GroupCollection SearchStringForStates(string str)
{
return Regex.Match(str,
"^" + Patterns.StateUS,
RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase).Groups;
}
}
Tôi muốn để có thể tạo ra 2) như với một mẫu T4, như tất cả các nối này là giống hệt nhau trên tất cả các thực hiện:
@"\b(?<STATE><#=CharTree.GenerateRegex(Enumerable.Union(
AddrVals.USstates.Keys,
AddrVals.USstates.Values)#>)\b";
này hoạt động, nhưng nếu tôi tạo ra một thành viên mới của MyStringDicts
hoặc thêm/xóa một số giá trị khỏi từ điển của nó, mẫu T4 sẽ không nhận ra chúng cho đến khi loại trừ Patterns.cs khỏi biên dịch và biên dịch lại. Như Parser
phụ thuộc vào Patterns
, điều này thực sự không phải là một lựa chọn - Tôi cần chuyển đổi T4 để đưa vào tài khoản thay đổi các tập tin khác trong cùng một xây dựng.
Những điều tôi không muốn làm làm:
- Chia
MyStringDicts
vào dự án riêng của mình. Tôi muốn giữ các tập tin trong một dự án, vì chúng là một đơn vị logic. - Chỉ cần di chuyển
MyStringDicts
vào đầu Patterns.cs. Tôi cần các thành viên MyStringDicts cho các mục đích khác nữa (để tra cứu từ điển, hoặc trong các mẫu T4 khác, ví dụ.)
tôi thông qua những lời khuyên here về việc sử dụng T4Toolbox của VolatileAssembly
và như vậy, nhưng điều đó dường như chỉ làm việc cho hướng ngược lại, khi các tệp lớp cần được biên dịch lại sau khi chỉnh sửa mẫu T4.
Có gì Tôi muốn có thể?
sửa cho rõ ràng
Bạn có thể giải thích thêm một số lý do tại sao bạn làm điều này không? Tôi có thể thấy một số cách để đối phó với điều này, nhưng nó là loại khó để biết cái nào là phù hợp trong kịch bản của bạn mà không có một số nền tảng. – AVee
Btw, đây là những ý tưởng tôi đã có. Có lẽ gợi ý là đủ để giúp bạn đi. Các giải pháp được cung cấp bởi FuleSnabel có thể sẽ làm việc, bạn cũng có thể làm một cái gì đó tương tự bằng cách sử dụng những thứ trong không gian tên EnvDte. Nhưng có lẽ một cái gì đó đơn giản hơn sẽ làm. Bạn có thể xem xét việc đưa các lớp bạn cần vào T4 trong một dự án riêng biệt và chỉ tham chiếu nó từ các khuôn mẫu. Bạn cũng có thể tự động biên dịch và thực thi mã mà bạn cần động trong các mẫu T4 của mình. – AVee
@AVee cảm ơn vì đã buộc tôi phải làm điều đúng và bao gồm trường hợp thực tế của tôi. – Arithmomaniac