【问题标题】:Format to include data in C# code在 C# 代码中包含数据的格式
【发布时间】:2011-05-20 16:03:50
【问题描述】:

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

    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) .

我正在寻找一个交钥匙解决方案,这个问题还没有严重到需要任何额外的开发。

【问题讨论】:

  • 尝试使用 DataContractSerializer 将其序列化为 XML。

标签: c# coding-style project-organization


【解决方案1】:

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

如果场景需要,其他选项可能包括嵌入式数据库。

【讨论】:

    【解决方案2】:

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

    这是完全可能的:

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

    当然,要了解如何做到这一点,需要大量学习。

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

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

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

    【讨论】:

      【解决方案3】:

      你可以用

      创建一个design-time T4 text template
      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");
      //        -------------------- ---------- ------------- -------
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2015-03-15
          • 1970-01-01
          • 2010-09-18
          • 2023-04-07
          • 2021-05-16
          • 1970-01-01
          • 2023-04-02
          • 2021-02-01
          • 1970-01-01
          相关资源
          最近更新 更多