Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用';硬编码';字典/枚举_C#_.net_Localization_Hardcode - Fatal编程技术网

C# 如何使用';硬编码';字典/枚举

C# 如何使用';硬编码';字典/枚举,c#,.net,localization,hardcode,C#,.net,Localization,Hardcode,我想创建一个字符串的“字典”,但是我只学会了如何使用字符串引用字典中我想要的内容。我想要一些更自动更正的东西(因为输入错误可能发生在一个大的字符串表中),这就是我想知道如何硬编码的原因。(字符串的值将从文本文件中检索,如JSON) 我注意到微软在他们的字符串资源文件中使用了某种类型的硬编码 因此,不要这样做: string result = strings["Hello"]; 我希望这样做: string result = strings.Hello; 我唯一能想到的就是使用一些外部工具,用

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

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

因此,不要这样做:

string result = strings["Hello"];
我希望这样做:

string result = strings.Hello;
我唯一能想到的就是使用一些外部工具,用文本文件中的值创建一个enum/struct脚本。有没有更好的选择,也许是内置在.NET中的

编辑:我认为“强类型”比“硬编码”更适合描述


编辑2:感谢所有的评论和答案。从外观上看,需要一些代码生成器来验证这个结果。我想知道是否已经有任何工具可以为您做到这一点(我试图寻找,但我的术语可能缺乏)。创建这个工具似乎不太困难。

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

例如:
compiletime常量和runtime常量

您希望获得自动更正/智能感知支持,需要编译时常量。这些是唯一的智能,语法突出和编译器双重检查为您

但是您要求从第三方文本文件生成值,这表示运行时常量或某种自动代码生成。运行时常量将取消编辑器支持。而代码生成会遇到问题,因为编辑器只有文件的旧副本。如果一个文件中的字符串发生更改,则很有可能会破坏成吨的代码

因此,您的两个需求本质上是不一致的。你需要有你的蛋糕,也要吃它

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

枚举用于常量的大多数部分组,默认情况下为整数组。添加了对分配的类型检查。这使他们成为一个很好的方法。引用组中的值就像引用任何常量、只读静态字段或只读属性一样。(还有其他优势,比如旗帜,但我怀疑它们在这里是否重要)

虽然枚举有一个字符串可以用于显示和输入解析(在源代码中使用),但该字符串绝对不适合显示。默认情况下,它们都是CAP,您需要支持本地化。我的原始解决方案是一个翻译层。我在StringRepresentation中添加了一个
字典。可以在运行时生成甚至更改此词典:

  • 我需要显示任何特定的值,它是
    someEnumLocalization[someEnum]
    。我可以在枚举的编译器表示形式ToString()中添加默认行为
  • 我需要解析用户输入?在找到匹配项之前,对这些值进行初始化,如果没有,则抛出ParseException
  • 我开始使用编译时检查。无需在其他任何地方处理非常不可变的编译端字符串。或者我的代码端字符串一直在变化

您可以使用T4模板吗?我在过去做过这件事,如果你记得适当地重新生成它们,那么它就足够好了。如果你想要完整的智能感知,你就必须编写一些静态类,正如@canton7所建议的那样。如果您愿意放弃intellisense,您可以尝试。有一个通用的只读集合:|它没有编译时常量/枚举的性能优势,但至少使用代码无法更改它。您看过资源文件背后的代码吗?每个键都有一个属性。@RubensFarias:我假设OP不想动态编译和加载这些东西,因为他编写了
string result=strings.Hello否则,我认为这或多或少不能回答OP的问题,即如何为某个类生成一组属性(请参见它们的
字符串
变量)