在C#应用程序中访问硬编码数据

在C#应用程序中访问硬编码数据,c#,.net,embedded-resource,C#,.net,Embedded Resource,我试图避免在.NET2.0即将成为3.5的应用程序中进行硬编码 我有一个大型枚举,我希望将其1到1映射到一组字符串。每个枚举值还将映射到指示操作的2个值中的1个。现有的代码使用一个大的switch语句来实现这一点,但在我看来这很难看 是否有更好的存储和访问数据的方法 我已经考虑过RESX文件,但是当你认为设计器文件包含了很多硬编码的值时,它看起来有点没有意义。 在程序集中嵌入xml文件是个好主意吗 “大转变”的说法是否不像看上去那么糟糕 有更好的解决方案吗?尽管switch语句有多难看,但它是将

我试图避免在.NET2.0即将成为3.5的应用程序中进行硬编码

我有一个大型枚举,我希望将其1到1映射到一组字符串。每个枚举值还将映射到指示操作的2个值中的1个。现有的代码使用一个大的switch语句来实现这一点,但在我看来这很难看

是否有更好的存储和访问数据的方法

我已经考虑过RESX文件,但是当你认为设计器文件包含了很多硬编码的值时,它看起来有点没有意义。 在程序集中嵌入xml文件是个好主意吗

“大转变”的说法是否不像看上去那么糟糕


有更好的解决方案吗?

尽管switch语句有多难看,但它是将枚举映射到字符串的最有效方法。嵌入XML文件只会增加程序集的大小,并且需要更长的时间才能获得所需的字符串值。

尽管switch语句有多难看,但它是将枚举映射到字符串的最有效方法。嵌入XML文件只会增加程序集的大小,并且需要更长的时间才能获得所需的字符串值。

您可以使用“枚举描述”属性为每个枚举值指定一个字符串。我不知道它是否比switch语句更有效,但它确实具有在代码中定义枚举的同一位置分配字符串值的优势


CodeProject有一篇文章。还有一个很好的例子。

您可以使用Enum description属性为每个枚举值分配一个字符串。我不知道它是否比switch语句更有效,但它确实具有在代码中定义枚举的同一位置分配字符串值的优势

CodeProject有一篇文章。还有一个很好的例子。

另请参见问题的答案

恕我直言,大开关语句总是一种代码味道,而且不可能维护。

还可以查看问题的答案


总之,big switch语句总是一种代码味道,而且不可能维护。

在这种情况下使用枚举是试图在一个圆孔中插入一个方形的peg。然而,XML对于您所要做的事情来说是过分的

改用字典。这样,就有了一个直接的“key=>value”关系,值可以是任何东西

对于1-1字符串关系,请使用以下命令:

Dictionary<string, string> dictA = new Dictionary<string, string>();
dictA.Add("string1", "value1");
dictA.Add("string2", "value2");
dictA.Add("string3", "value3");
Dictionary<string, List<string>> dictB = new Dictionary<string, List<string>>();
dictB.Add("string1", new List<string>() {"value1A", "value1B"});
dictB.Add("string2", new List<string>() {"value2A", "value2B"});
dictB.Add("string3", new List<string>() {"value3A", "value3B"});
Dictionary<string, List<string>> dictB = new Dictionary<string, List<string>>();
dictB.Add("string1", new List<string>() {"value1A", "value1B, value1C"});
dictB.Add("string2", new List<string>() {"value2A", "value2B, value2C, value2D"});
dictB.Add("string3", new List<string>() {"value3A", "value3B"});

Enums只不过是一本美化了的字典。这就是为什么在许多其他语言(特别是动态类型语言)中看不到它们的原因。

在这种情况下,使用枚举是试图在圆孔中插入一个方形的销钉。然而,XML对于您所要做的事情来说是过分的

改用字典。这样,就有了一个直接的“key=>value”关系,值可以是任何东西

对于1-1字符串关系,请使用以下命令:

Dictionary<string, string> dictA = new Dictionary<string, string>();
dictA.Add("string1", "value1");
dictA.Add("string2", "value2");
dictA.Add("string3", "value3");
Dictionary<string, List<string>> dictB = new Dictionary<string, List<string>>();
dictB.Add("string1", new List<string>() {"value1A", "value1B"});
dictB.Add("string2", new List<string>() {"value2A", "value2B"});
dictB.Add("string3", new List<string>() {"value3A", "value3B"});
Dictionary<string, List<string>> dictB = new Dictionary<string, List<string>>();
dictB.Add("string1", new List<string>() {"value1A", "value1B, value1C"});
dictB.Add("string2", new List<string>() {"value2A", "value2B, value2C, value2D"});
dictB.Add("string3", new List<string>() {"value3A", "value3B"});

Enums只不过是一本美化了的字典。这就是为什么在许多其他语言(特别是动态类型语言)中看不到它们的原因。

这两种语言都是映射字符串的好方法,但我还需要映射到第二个2值属性,这是我无法使用您的解决方案的。您可以始终定义自己的自定义属性。看见唯一的问题是,您需要使用反射来获取值,因此它可能不会像switch语句那样有效。只有在由于性能问题而没有其他选项时,才应使用反射。这两种方法都是映射字符串的好方法,但我还需要映射到第二个2值属性,而我无法使用您的解决方案。您始终可以定义自己的自定义属性。看见唯一的问题是,您需要使用反射来获取值,因此它可能不会像switch语句那样有效。只有在由于性能问题而没有其他选项时,才应使用反射。这两种方法都是映射字符串的好方法,但我还需要映射到第二个2值属性,而我无法使用您的解决方案。好的,使用另一个字典,或者使用
字典
这两个都是映射字符串的好主意,但我还需要映射到第二个2值属性,我无法使用您的解决方案。好的,使用另一个字典,或者在不理想的情况下使用
字典
,我认为这可能是最简单的解决方案。在不理想的情况下,我认为这可能是最简单的解决方案。
string match = "string2";
if (dictD.ContainsKey(match))
{
    Console.WriteLine("The value for Key='{0}' is: '{1}'", match, dictD[match]);
}