如何在C#枚举中设置字符串?

4

我想在C#中创建字符串ENUM

基本上,我想在Enum中设置窗体名称。当我在主页打开表单时,我想要为表单名称切换案例并打开特定的表单。 我知道ENUM仅允许整数,但我想将其设置为string。 有什么想法吗?


1
枚举不能是字符串,枚举始终是整数值。您可以使用Enum类将枚举值的名称作为字符串获取,但无法使用空格等。 - IanNorton
1
.NET 中的枚举是值类型,必须基于整数值 (byte、int、long 等)。 - Mithrandir
你想知道根据枚举应该加载哪个页面吗? - adt
1
为什么C#不支持字符串枚举? - Felix K.
7个回答

18

枚举类型不能是字符串,但您可以附加属性,然后可以按如下方式读取枚举值....................

public enum States
{
    [Description("New Mexico")]
    NewMexico,
    [Description("New York")]
    NewYork,
    [Description("South Carolina")]
    SouthCarolina
}


public static string GetEnumDescription(Enum value)
{
    FieldInfo fi = value.GetType().GetField(value.ToString());

    DescriptionAttribute[] attributes =
        (DescriptionAttribute[])fi.GetCustomAttributes(
        typeof(DescriptionAttribute),
        false);

    if (attributes != null &&
        attributes.Length > 0)
        return attributes[0].Description;
    else
        return value.ToString();
}

如果你想详细了解,这里有一篇不错的文章:在C#中将字符串与枚举关联


5

正如大家所说,C#中的枚举不能是字符串(或除整数以外的任何类型)。我猜你来自Java?如果.NET有这个功能就好了,可以让枚举成为任何类型。

我通常绕过这个问题的方法是使用静态类:

public static class MyValues
{
    public static string ValueA { get { return "A"; } }
    public static string ValueB { get { return "B"; } }
}

使用这种技术,您也可以使用任何类型。您可以像使用枚举一样调用它:

if (value == MyValues.ValueA) 
{
    // do something
}

这种 hack 的问题在于它们无法真正发挥枚举类型的“强类型”优势。例如,在您的情况下,我将能够执行 bool b = MyValues.ValueA == "someString" - nawfal
真的,但我很少发现这是有问题的。如果MyValues.ValueA确实是“someString”,我希望它返回true。字符串是一个简单的例子,但它也允许更复杂的类型。 - Peter
对于被密封并且有私有构造函数的复杂类型,这种模式是一个很好的替代品。但对于像字符串这样的其他类型则不然。我发布的问题很简单。比如:string a = MyValues.ValueA; 然后,a = "haha"; 基本上破坏了枚举的概念.. 我同意没有简单的解决方法。属性仍然是最好的选择.. - nawfal
很棒的解决方案,适用于我需要的每种情况。喜欢它 +1 - Unome

2

请执行以下操作:

private IddFilterCompareToCurrent myEnum = 
(IddFilterCompareToCurrent )Enum.Parse(typeof(IddFilterCompareToCurrent[1]),domainUpDown1.SelectedItem.ToString());

[Enum.parse] 返回一个对象,因此您需要进行强制类型转换。

2

我不确定我是否正确理解了你的意思,但我认为你正在寻找这个?

   public enum State { State1, State2, State3 };

    public static State CurrentState = State.State1;

    if(CurrentState ==  State.State1)
    {
    //do something
    }

2

我认为枚举并不是你问题的最佳解决方案。正如其他人已经提到的,枚举的值只能是整数值。

你可以简单地使用一个字典来存储表格及其名称,例如:

Dictionary<string, Form> formDict = new Dictionary<string, Form>();

private void addFormToDict(Form form) {
  formDict[form.Name] = form;
}

// ...
addFormToDict(new MyFirstForm());
addFormToDict(new MySecondForm());
// ... add all forms you want to display to the dictionary


if (formDict.ContainsKey(formName))
  formDict[formName].Show();
else
  MessageBox.Show(String.Format("Couldn't find form '{0}'", formName));

2
要么将Enum成员的名称命名为所需并使用.ToString(),要么编写以下类似函数...
string MyEnumString(MyEnum value)
{
    const string MyEnumValue1String = "any string I like 1";
    const string MyEnumValue2String = "any string I like 2";
    ...

    switch (value)
    {
        case MyEnum.Value1:
            return MyEnumValue1String;

        case MyEnum.Value2:
            return MyEnumValue2String;

        ...
    }
}

或者使用一些值和字符串的字典或哈希集代替。

1

string 枚举在 C# 中不存在。请参见 this related question

为什么不使用 int(枚举的默认类型)而不是 string


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接