编码样式 - 在 C# 代码中包含数据的格式

本文关键字:包含 数据 格式 代码 样式 编码 | 更新日期: 2023-09-27 17:57:00

我有一个使用硬编码值表的程序。 例如

    public static readonly IDictionary<SpecBuild, BuildInfo> Builds = new Dictionary<SpecBuild, BuildInfo> {
            { SpecBuild.WarriorArms,
                    new BuildInfo {
                            Class = Class.Warrior,
                            Name = "Arms",
                            Role = Role.Melee
                    }
                    },
            { SpecBuild.WarriorFury,
                    new BuildInfo {
                            Class = Class.Warrior,
                            Name = "Fury",
                            Role = Role.Melee
                    }
                    },
            { SpecBuild.WarriorProtection,
                    new BuildInfo {
                            Class = Class.Warrior,
                            Name = "Protection",
                            Role = Role.Tank
                    }
                    }, ...

这些数据很少更改,所以我可以对其进行硬编码。问题是很难读取这些数据,并且格式化不起作用,因为 Resharper 以不同的方式重新格式化它。

理想情况下,我想要一个带有自定义 VS2010 查看器的特殊格式文件,该文件将此信息显示为表,并在编译过程中为这些表生成 C# 代码,甚至可能将其直接编译为 MSIL (CLR)。

我正在寻找一个交钥匙解决方案,问题还不够严重,无法保证任何额外的开发。

编码样式 - 在 C# 代码中包含数据的格式

我会(并且有很多次)将这种类型的数据推送到文件中(也许通过resx)。然后通过您选择的反序列化程序加载数据。如果需要轻松编辑,可以通过JavaScriptSerializer或 JSON.NET 进行JSON。如果被告知数据和性能是关键,也许是更硬核的东西(也许是二进制)。XML当然也是一个可行的选择。

如果方案允许,其他选项可能包括嵌入式数据库。

理想情况下,我想要一个带有自定义VS2010查看器的特殊格式文件

这是完全可能的:

  • 创建 DSL
  • 编写支持 DSL 的 VS2010 扩展
  • 编写用于执行生成的工具(MSBuild 任务)
  • 编写安装程序以使用该工具更新 VS 安装。

当然,这将是很多学习来理解如何做到这一点。

如果您有很多应用程序,其中许多开发人员使用相同类型的信息,那么这将是有意义的。否则还有其他选择:

  1. 配置锐化器不重新格式化它(我认为这是可能的)。
  2. 使用 VS 已经可以编辑的数据格式(文本、XML、JSON ...)。 在构建时添加为资源,并创建一个工具以在应用程序启动时(或按需)创建对象图。

显然,#1(可能)是最简单但脆弱的。 #2 已建立 - 这就是处理资源的方式(XAML 也可以)。

可以使用以下命令创建设计时 T4 文本模板

void SpecBuild(string spec, string @class, string name, string role)
{
    Write(string.Format("{{ SpecBuild.{0}, " +
                        "new BuildInfo {{ " +
                        "Class = Class.{1}, " +
                        "Name = @'"{2}'", " +
                        "Role = Role.{3} " +
                        "}} " +
                        "}},",
                        spec,
                        @class,
                        name.Replace("'"", "'"'""),
                        role));
}

//        SpecBuild            Class      Name          Role
//        -------------------- ---------- ------------- -------
SpecBuild("WarriorArms",       "Warrior", "Arms",       "Melee");
SpecBuild("WarriorFury",       "Warrior", "Fury",       "Melee");
SpecBuild("WarriorProtection", "Warrior", "Protection", "Melee");
//        -------------------- ---------- ------------- -------

Resharper 允许我按扩展名排除文件,所以我将我的文件命名为 *.data.cs,根据需要格式化数据,Resharper 不会重新格式化它。