我们的控制系统有很多具有特定版本的数据文件。数据文件是“仅附加”的,因此更高版本将始终包含早期版本中定义的超集。
为了避免在我们的代码中出现“幻数”,我们创建了一个代码生成器,它获取一段数据并将其转换为 C# 类文件。我有一个非常大的类库,几乎只包含这样的文件。这会导致代码更具可读性和一些额外的编译器检查,因为以前有风险的类型转换现在可以成为生成代码的一部分,以便库的用户直接使用他们正确的子类型。
但是,问题出现在最新版本的类库中使用了什么数据文件版本。我希望每个类文件都“贡献”到一个全局列表。如果静态构造函数自动运行,我会这样做:
// GlobalConstants.cs (not generated)
public static partial class GlobalConstants
{
public static List<string> Lst = new List<string>();
static void AddVersionInfo(string mod)
{
Lst.Add(mod);
}
}
// Motor.cs
public static partial class GlobalConstants
{
// Generated from Motor metadata
public class MotorUtil
{
public const int SomeConst1 = 2;
static MotorUtil()
{
AddVersionInfo("<Motor version info>");
}
}
}
// Tank.cs
public static partial class GlobalConstants
{
// Generated from Tank metadata
public class TankUtil
{
public const int SomeConst1 = 2;
public const int SomeConst2 = 3;
public const int SomeConst3 = 5;
static TankUtil()
{
AddVersionInfo("<Tank version info>");
}
}
}
如果静态构造函数自动运行,这将导致每个生成的文件(tank.cs、motor.cs、boiler.cs 等)都被添加到列表中,可以通过工具进行检查。
一个编译时 MEF,如果你喜欢的话。
很遗憾。如果我打印出“Lst”的内容,那么它总是一个空列表,因为静态构造函数没有运行。
这些 .cs 文件来自不同的各方,不应要求 GlobalConstants.cs 的作者了解它们。我的问题是:有没有一种方法可以生成此代码,以便可以随意添加生成的 .cs 文件,它们将出现在“Lst”列表中?