匹配字符串与枚举?

时间:2009-12-22 17:14:33

标签: c#

我正在使用第三方DLL,它希望在方法签名中使用名为“DaysOfWeek”的枚举。

我允许我的用户从ComboBox中选择星期几,但我最终得到了一个字符串。

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

谢谢!

11 个答案:

答案 0 :(得分:44)

Enum.Parse(typeof(DaysOfWeek), yourStringValue, true);

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

答案 1 :(得分:17)

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

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

如果用户可以键入自己的值,也可以使用不区分大小写的重载:

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

答案 2 :(得分:3)

假设组合框包含枚举名称。

ComboBox cb = new ComboBox();

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

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

答案 3 :(得分:2)

很抱歉有交叉引用,但在我的anser中有一个名为EnumPair<T>的辅助类 您可以使用它来填充ComboBox并使枚举值重新使用。

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

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

这是原始posting

答案 4 :(得分:1)

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

答案 5 :(得分:1)

您可以在Enum静态类型上使用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;

答案 6 :(得分:1)

创建一个看起来像这样的类:

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

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

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

答案 7 :(得分:0)

如果您从DaysOfWeek枚举中填充ComboBox:

this.comboBox1.DataSource = Enum.GetValues(typeof(DayOfWeek));

然后,您可以从ComboBox的SelectedItem属性中获取枚举值:

DayOfWeek selected = (DayOfWeek)this.comboBox1.SelectedItem;

答案 8 :(得分:0)

除了其他(正确和内置)建议之外,还有一个有趣的第三方Enum<T>课程,它使得使用枚举更加美好:

http://blog.logrythmik.com/post/Better-Enum-Parsing-using-Strongly-Typed-Generics.aspx

答案 9 :(得分:0)

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

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();
    ...
}

然后,您可以访问星期几:

    (DayOfWeek) dayOfWeekComboBox.SelectedValue;

答案 10 :(得分:0)

这是我更喜欢的。如果解析失败,则需要进行处理。

// 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

}