3

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

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

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

4

4 回答 4

2

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

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

于 2011-05-20T16:11:14.047 回答
0

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

这是完全可能的:

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

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

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

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

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

于 2011-05-20T16:12:22.533 回答
0

您可以创建一个设计时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");
//        -------------------- ---------- ------------- -------
于 2011-05-20T16:14:51.760 回答
0

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

于 2011-06-17T21:33:51.923 回答