如何使用 'hard-coded' dictionary/enum
How to use a 'hard-coded' dictionary/enum
我想创建一个 'dictionary' 字符串,但是我只学会了如何使用字符串在字典中引用我想要的内容。我想要一些具有更多自动更正功能的东西(因为拼写错误可能发生在大量 table 字符串中),这就是为什么我想知道如何硬编码。 (字符串的值将从文本文件中检索,如 JSON)。
我注意到 Microsoft 在其字符串资源文件中使用了某种类型的硬编码。
所以不要这样做:
string result = strings["Hello"];
我想这样做:
string result = strings.Hello;
我唯一能想到的就是使用一些外部工具,用文本文件中的值创建一个 enum/struct 脚本。是否有更好的选择,也许是 .NET 内置的?
编辑:我认为 'strongly-typed' 比 'hard-coded' 更好。
编辑 2:感谢所有评论和回答。从外观上看,需要一些代码生成才能实现此结果。我想知道是否已经有任何工具可以为您执行此操作(我尝试查看但可能缺少我的术语)。创建这个工具似乎并不难。
我不太明白你想要什么输出,但我只是向这里提出一个想法 - 如何扩展 class 字符串并向其中添加你自己的方法?所以当你使用 strings.Hello 它会 return 你想要什么?
有compiletime常量和运行time常量。
您希望Autocrrection/Intellisense支持需要一个编译时常量。这些是唯一的 Intellisence、Syntax Highlighting 和 Compiler 双重检查。
但是您要求从第 3 方文本文件生成值,表明 运行 时间常数或一些自动代码生成。运行时常量会取消对编辑器的支持。虽然代码生成会 运行 出现问题,但编辑器只有文件的旧副本。 并且如果该文件中的字符串发生更改,则破坏大量代码的风险很高。
所以你的两个要求本来就是不一致的。你要有你的蛋糕,也要吃。
也许我对 Enum/ToString() 问题的原始解决方案可能对您有所帮助?
枚举大部分是常量组,默认是整型。添加了对作业的类型检查。这使它们成为绕过 Primitive Obsession 的好方法。您可以像引用任何常量、只读静态字段或只读 属性 一样从组中引用一个值。 (还有其他优势,例如 Flags,但我怀疑它们在这里很重要)。
虽然枚举有一个可用于显示和输入解析的字符串(您在源代码中使用的字符串),但绝对不适合显示。默认情况下,它们全部大写,您需要支持本地化。我的原始解决方案是一个翻译层。我加一个Dictionary<someEnum, String> SomeEnumStringRepresentation
。该词典可以在 运行 时间生成甚至更改:
- 我需要显示任何特定值,它是
SomeEnumLocalisation[someEnum]
。我可以将默认行为添加到 ToString(),即枚举的编译器表示形式。
- 我需要解析用户输入?遍历这些值,直到找到匹配项,否则抛出 ParseException。
- 我开始使用编译时检查。无需在其他任何地方处理非常不可变的编译端字符串。或者我的代码端字符串一直在变化。
我想创建一个 'dictionary' 字符串,但是我只学会了如何使用字符串在字典中引用我想要的内容。我想要一些具有更多自动更正功能的东西(因为拼写错误可能发生在大量 table 字符串中),这就是为什么我想知道如何硬编码。 (字符串的值将从文本文件中检索,如 JSON)。
我注意到 Microsoft 在其字符串资源文件中使用了某种类型的硬编码。
所以不要这样做:
string result = strings["Hello"];
我想这样做:
string result = strings.Hello;
我唯一能想到的就是使用一些外部工具,用文本文件中的值创建一个 enum/struct 脚本。是否有更好的选择,也许是 .NET 内置的?
编辑:我认为 'strongly-typed' 比 'hard-coded' 更好。
编辑 2:感谢所有评论和回答。从外观上看,需要一些代码生成才能实现此结果。我想知道是否已经有任何工具可以为您执行此操作(我尝试查看但可能缺少我的术语)。创建这个工具似乎并不难。
我不太明白你想要什么输出,但我只是向这里提出一个想法 - 如何扩展 class 字符串并向其中添加你自己的方法?所以当你使用 strings.Hello 它会 return 你想要什么?
有compiletime常量和运行time常量。
您希望Autocrrection/Intellisense支持需要一个编译时常量。这些是唯一的 Intellisence、Syntax Highlighting 和 Compiler 双重检查。
但是您要求从第 3 方文本文件生成值,表明 运行 时间常数或一些自动代码生成。运行时常量会取消对编辑器的支持。虽然代码生成会 运行 出现问题,但编辑器只有文件的旧副本。 并且如果该文件中的字符串发生更改,则破坏大量代码的风险很高。
所以你的两个要求本来就是不一致的。你要有你的蛋糕,也要吃。
也许我对 Enum/ToString() 问题的原始解决方案可能对您有所帮助?
枚举大部分是常量组,默认是整型。添加了对作业的类型检查。这使它们成为绕过 Primitive Obsession 的好方法。您可以像引用任何常量、只读静态字段或只读 属性 一样从组中引用一个值。 (还有其他优势,例如 Flags,但我怀疑它们在这里很重要)。
虽然枚举有一个可用于显示和输入解析的字符串(您在源代码中使用的字符串),但绝对不适合显示。默认情况下,它们全部大写,您需要支持本地化。我的原始解决方案是一个翻译层。我加一个Dictionary<someEnum, String> SomeEnumStringRepresentation
。该词典可以在 运行 时间生成甚至更改:
- 我需要显示任何特定值,它是
SomeEnumLocalisation[someEnum]
。我可以将默认行为添加到 ToString(),即枚举的编译器表示形式。 - 我需要解析用户输入?遍历这些值,直到找到匹配项,否则抛出 ParseException。
- 我开始使用编译时检查。无需在其他任何地方处理非常不可变的编译端字符串。或者我的代码端字符串一直在变化。