【问题标题】:How to use a 'hard-coded' dictionary/enum如何使用“硬编码”字典/枚举
【发布时间】:2020-02-03 14:43:33
【问题描述】:

我想创建一个字符串的“字典”,但是我只学习过如何使用字符串来引用字典中我想要的内容。我想要更自动更正的东西(因为拼写错误可能发生在大字符串表中),这就是我想知道如何硬编码的原因。 (字符串的值将从文本文件中检索,例如 JSON)。

我注意到微软在他们的字符串资源文件中使用了某种类型的硬编码。

所以不要这样做:

string result = strings["Hello"];

我希望这样做:

string result = strings.Hello;

我唯一能想到的就是使用一些外部工具来创建一个枚举/结构脚本,其中包含来自文本文件的值。有没有更好的选择,也许是 .NET 内置的?

编辑:我认为“强类型”比“硬编码”更好。

编辑 2:感谢所有 cmets 和答案。看起来,需要一些代码生成来实现这个结果。我想知道是否已经有任何工具可以为您执行此操作(我尝试查找,但可能缺少我的术语)。创建这个工具似乎并不难。

【问题讨论】:

  • 您可以使用 T4 模板吗?我过去已经这样做了,并且效果很好,只要您记得适当地重新生成它们
  • 如果你想要完整的智能感知,你必须编码生成一些静态类,正如@canton7 所建议的那样。如果您愿意放弃智能感知,可以尝试ExpandoObject
  • 有通用的只读集合:docs.microsoft.com/en-us/dotnet/api/… |不会有编译时常量/Enums的性能优势,但至少使用代码是无法改变的。
  • 你看过资源文件背后的代码吗?每个键都有一个属性。
  • @RubensFarias:我假设 OP 不想即时编译和加载这些东西,因为他写了string result = strings.Hello; 否则,或多或少是Assembly.LoadFrom

标签: c# .net localization hardcode


【解决方案1】:

compiletime 常量和 runtime 常量。

您希望 Autocrrection/Intellisense 支持需要一个编译时间常数。只有这些是 Intellisence、Syntax Highlighting 和 Compiler 为您仔细检查的内容。

但是您要求从第 3 方文本文件中生成值,这表示运行时常量或某些自动代码生成。运行时常量会剥夺编辑器的支持。虽然编辑器只有文件的旧副本,但代码生成会遇到问题。 而且如果该文件中的字符串发生更改,则很有可能破坏大量代码。

所以你的两个要求本质上是不一致的。你需要拥有你的蛋糕并吃掉它。

也许我对 Enum/ToString() 问题的原始解决方案可能对您有所帮助?

枚举适用于大多数常量组,默认情况下是整数组。增加了对分配的类型检查。这使他们成为Primitive Obsession 的好方法。您可以像引用任何常量、只读静态字段或只读属性一样从组中引用一个值。 (还有其他优点,例如标志,但我怀疑它们在这里是否重要)。

虽然 Enums 有一个可用于显示和输入解析的字符串——你在源代码中使用的那个——但它绝对不适合显示。默认情况下,它们都是大写的,您需要支持本地化。我的原始解决方案是一个翻译层。我添加了一个Dictionary<someEnum, String> SomeEnumStringRepresentation。这个字典可以在运行时生成甚至更改:

  • 我需要显示任何特定值,它是SomeEnumLocalisation[someEnum]。我可以将默认行为添加到仅 ToString() Enum 的编译器表示。
  • 我需要解析用户输入吗?遍历这些值,直到找到匹配项,否则抛出 ParseException。
  • 我开始使用编译时检查。无需在其他任何地方处理非常不可变的编译端字符串。或者我的代码端字符串一直在变化。

【讨论】:

    【解决方案2】:

    我不明白你想要什么输出,但我只是在这里提出一个想法 - 如何扩展类字符串并添加你自己的方法?所以当你使用 strings.Hello 它会返回你想要的?

    示例: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods

    【讨论】:

    • 我不认为这回答了 OP 的问题,即如何为某个类生成一组属性(参见他们的strings 变量)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    相关资源
    最近更新 更多