C# 仅使用字符串值的公共枚举

C# 仅使用字符串值的公共枚举,c#,enumeration,C#,Enumeration,我总是不知道应该使用哪种枚举。哈希表、枚举、结构、字典、数组(多古老)、静态字符串 我希望使用一个漂亮的枚举,而不是在代码中使用字符串,如下所示: public enum MyConfigs { Configuration1, Configuration2 } 问题是我并不总是想将枚举转换为字符串(),因为我对枚举的索引表示形式不感兴趣 表示基于字符串的值的公共枚举的最佳方式是什么? 最后,我希望在代码中需要的地方使用myconfig.Configuration1 public

我总是不知道应该使用哪种枚举。哈希表、枚举、结构、字典、数组(多古老)、静态字符串

我希望使用一个漂亮的枚举,而不是在代码中使用字符串,如下所示:

public enum MyConfigs
{
    Configuration1,
    Configuration2
}
问题是我并不总是想将枚举
转换为字符串()
,因为我对
枚举的索引表示形式不感兴趣

表示基于字符串的值的公共枚举的最佳方式是什么?
最后,我希望在代码中需要的地方使用
myconfig.Configuration1

public static class MyConfigs
{
    public const string Configuration1 = "foo",
                        Configuration2 = "bar"
}
这与枚举的实现方式几乎相同(忽略整个“它必须是整数”的内容)。

我更喜欢将“分组”常量定义为伪静态类的静态成员,如下所示:

public static class FieldNames
{
    public const string BRANCH_CODE = "_frsBranchCode";
    public const string BATCH_ID = "_frsBatchId";
    public const string OFFICE_TYPE = "_frsOfficeType";
}
但当然,它们不是直接“可枚举的”,因此除非您也提供了一个静态数组,否则无法对它们进行foreach:

public static string[] AllFieldNames
{
    get
    {
        return new string[]
        {
            FieldNames.BRANCH_CODE,
            FieldNames.BATCH_ID,
            FieldNames.OFFICE_TYPE
        };
    }
}

类型安全枚举模式

public class StringEnum
{
    #region Enum Values

    public static readonly StringEnum ValueOne = new StringEnum("Value One");
    public static readonly StringEnum ValueTwo = new StringEnum("Value Two");

    #endregion

    #region Enum Functionality

    public readonly string Value;

    private StringEnum(string value)
    {
        Value = value;
    }

    public override string ToString()
    {
        return value;
    }

    #endregion
}
您可以这样使用:

private void Foo(StringEnum enumVal)
{
  return "String value: " + enumVal;
}

如果您永远不需要以类型安全的方式将这些值传递给方法等,那么最好只使用常量文件。

根据您的问题,您实际上不需要hastable或KeyValuePair DS。您能告诉我们配置1、配置2等是什么类型吗。?你这样做的目的是什么。基本上添加更多信息,plz。实际上只是字符串。最后,它们将在日志中显示为“此错误来自
Configuration1
”。枚举是最佳选择,但每次需要转换或装箱时都会发生,从而降低性能。所以按照Marc的建议去做。你需要把这些值作为参数传递给方法吗?如果是这样,您可能希望查看类型安全枚举模式。这将允许您像这样传递“枚举”字符串:
private void Foo(StringEnum value){…}
使用类不是很难看吗?那么这些漂亮的枚举表是干什么用的呢?;-)在我看来,使用枚举来表示字符串值会更难看(更不用说非常规了),因为ToString()到处都是。我说,不要害怕在你的项目中出现少量的微类。@moontear它有多难看?归根结底,这与定义枚举没有太大区别。从其他观点来看,这并不难看。我只是觉得这很难看,因为我为此定义了一个完整的类——但正如Ishmael所说,在这里和那里有一个微类可能是好的。