C# 是否将字符串与枚举匹配?

C# 是否将字符串与枚举匹配?,c#,C#,我使用的是一个第三方DLL,它希望在方法签名中有一个名为“DaysOfWeek”的枚举 我允许我的用户从一个组合框中选择一周中的哪一天,但最后我得到了一个字符串 如何将字符串与相应的枚举属性相匹配 谢谢 您可以使用将字符串转换为实际枚举。您可以使用以下方法将字符串转换为枚举: DaysOfWeek value = (DaysOfWeek)Enum.Parse( typeof(DaysOfWeek), enumAsString ); 如果用户可以键入自己的值,也可以使用不区分大小写的重载:

我使用的是一个第三方DLL,它希望在方法签名中有一个名为“DaysOfWeek”的枚举

我允许我的用户从一个组合框中选择一周中的哪一天,但最后我得到了一个字符串

如何将字符串与相应的枚举属性相匹配


谢谢

您可以使用将字符串转换为实际枚举。

您可以使用以下方法将字符串转换为枚举:

 DaysOfWeek value = (DaysOfWeek)Enum.Parse( typeof(DaysOfWeek), enumAsString );
如果用户可以键入自己的值,也可以使用不区分大小写的重载:

 DaysOfWeek value = (DaysOfWeek)Enum.Parse( typeof(DaysOfWeek), enumAsString, true );

注意:如果字符串不能转换为枚举,则会启动异常。最后一个参数用于不区分大小写的搜索。

您可以对枚举静态类型使用Parse方法

DaysOfWeek day = (DaysOfWeek)Enum.Parse(typeof(DaysOfWeek), (string)dropDownList.SelectedItem);
或者,您可以直接使用枚举值填充下拉列表,并完全避免转换问题

    // Populate combobox.
    foreach (DaysOfWeek day in Enum.GetValues(typeof(DaysOfWeek)))
    {
        daysOfWeekCombo.Items.Add(day);
    }
    // Read combobox.
    DaysOfWeek day = (DaysOfWeek)daysOfWeekCombo.SelectedItem;

假设组合框包含枚举名称

ComboBox cb = new ComboBox();

cb.Items.AddRange(Enum.GetNames(typeof(DaysOfWeek));

(DaysOfWeek)Enum.Parse(typeof(DaysOfWeek), cb.SelectedText);

创建一个如下所示的类:

public class DayOfWeekComboBoxItem
{
   public string Day{get;set;}
   public DayOfWeek DayOfWeek{get;set;}

   public override ToString()
   {
      return this.Date;
   }
}

然后将组合框绑定到这些项的集合。然后,您可以将组合框中的SelectedItem强制转换为该类的实例。

很抱歉进行交叉引用,但在我的回答中,有一个名为
EnumPair的助手类。
您可以使用它来填充组合框,并使枚举的值返回以进一步使用

使用这三行将正确填充组合框:

cbo.DataSource = EnumPair<TEnum>.GetValuePairList();
cbo.ValueMember = EnumPair<TEnum>.ValueMember;
cbo.DisplayMember = EnumPair<TEnum>.DisplayMember;
cbo.DataSource=EnumPair.GetValuePairList();
cbo.ValueMember=EnumPair.ValueMember;
cbo.DisplayMember=EnumPair.DisplayMember;

如果您是从DaysOfWeek枚举填充组合框,以下是原始的

this.comboBox1.DataSource = Enum.GetValues(typeof(DayOfWeek));
然后可以从组合框的SelectedItem属性中获取枚举值:

DayOfWeek selected = (DayOfWeek)this.comboBox1.SelectedItem;
除了其他(正确且内置的)建议外,还有一个有趣的第三方
Enum
类,它使使用Enum变得更加友好:


您可以绑定到名称/值对列表,其中的值是您的枚举。 更多的工作,但是如果您需要的话,将更容易支持本地化。这里有一个方法:

static IList<KeyValuePair<string, DayOfWeek>> GetDayOfWeekBindingList()
{
    List<KeyValuePair<string, DayOfWeek>> dayOfWeekList = new List<KeyValuePair<string, DayOfWeek>>();

    foreach (int day in Enum.GetValues(typeof(DayOfWeek)))
    {
        string dayName = CultureInfo.CurrentCulture.DateTimeFormat.DayNames[day];
        dayOfWeekList.Add(new KeyValuePair<string, DayOfWeek>(dayName, (DayOfWeek)day));
    }
    return dayOfWeekList;
}

private void BindDayOfWeekComboBox()
{
    dayOfWeekComboBox.DisplayMember = "Key";
    dayOfWeekComboBox.ValueMember = "Value";
    dayOfWeekComboBox.DataSource = GetDayOfWeekBindingList();
}

private void Form1_Load(object sender, EventArgs e)
{
    BindDayOfWeekComboBox();
    ...
}

这是我想要的。如果解析失败,则需要处理它

// this will hold parsed value
DaysOfWeek daySelected;

// 'toMatch' is the string to be parsed or checked

if (Enum.TryParse(toMatch, out daySelected) && Enum.IsDefined(typeof(DaysOfWeek), daySelected))
{
    // parsed success, use 'daySelected'

}
else
{
    // parsed failed

}

你试过什么?有些解决方案可能比其他解决方案更优雅,但这似乎是一个将一个映射到另一个的简单问题。我知道您刚刚做了第二部分,作为如何实现的示例,但是,如果您可以通过下拉菜单进行即时验证,为什么还需要用户输入枚举类型的值呢?可能是在您不是从组合框驱动,而是从命令行参数驱动的情况下。我很感激这不是我提出的具体问题,但这些信息对我来说确实很有用!
    (DayOfWeek) dayOfWeekComboBox.SelectedValue;
// this will hold parsed value
DaysOfWeek daySelected;

// 'toMatch' is the string to be parsed or checked

if (Enum.TryParse(toMatch, out daySelected) && Enum.IsDefined(typeof(DaysOfWeek), daySelected))
{
    // parsed success, use 'daySelected'

}
else
{
    // parsed failed

}