【发布时间】:2009-12-22 17:14:33
【问题描述】:
我正在使用第 3 方 DLL,它需要在方法签名中调用一个名为“DaysOfWeek”的枚举。
我允许我的用户从 ComboBox 中选择星期几,但我最终得到了一个字符串。
如何将我的字符串与适当的枚举属性匹配?
谢谢!
【问题讨论】:
-
你试过什么?一些解决方案可能比其他解决方案更优雅,但这似乎是一个将一个映射到另一个的简单问题。
标签: c#
我正在使用第 3 方 DLL,它需要在方法签名中调用一个名为“DaysOfWeek”的枚举。
我允许我的用户从 ComboBox 中选择星期几,但我最终得到了一个字符串。
如何将我的字符串与适当的枚举属性匹配?
谢谢!
【问题讨论】:
标签: c#
Enum.Parse(typeof(DaysOfWeek), yourStringValue, true);
注意:如果字符串不能转换为枚举,这将引发异常。最后一个参数用于不区分大小写的搜索。
【讨论】:
您可以使用以下方法将字符串转换为枚举:
DaysOfWeek value = (DaysOfWeek)Enum.Parse( typeof(DaysOfWeek), enumAsString );
如果用户可以输入或自己的值,您也可以使用不区分大小写的重载:
DaysOfWeek value = (DaysOfWeek)Enum.Parse( typeof(DaysOfWeek), enumAsString, true );
【讨论】:
假设组合框包含枚举名称。
ComboBox cb = new ComboBox();
cb.Items.AddRange(Enum.GetNames(typeof(DaysOfWeek));
(DaysOfWeek)Enum.Parse(typeof(DaysOfWeek), cb.SelectedText);
【讨论】:
很抱歉交叉引用,但在我的分析器中,有一个名为 EnumPair<T> 的辅助类
您可以使用它来填充 ComboBox 并让枚举的值返回以供进一步使用。
使用这三行将为您正确填充组合框:
cbo.DataSource = EnumPair<TEnum>.GetValuePairList();
cbo.ValueMember = EnumPair<TEnum>.ValueMember;
cbo.DisplayMember = EnumPair<TEnum>.DisplayMember;
这里是原文posting
【讨论】:
您可以使用Enum.Parse 将字符串转换为实际的枚举。
【讨论】:
创建一个如下所示的类:
public class DayOfWeekComboBoxItem
{
public string Day{get;set;}
public DayOfWeek DayOfWeek{get;set;}
public override ToString()
{
return this.Date;
}
}
然后将您的组合框绑定到这些项目的集合。然后,您可以将组合框中的 SelectedItem 强制转换为该类的实例。
【讨论】:
您可以对 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;
【讨论】:
如果您从 DaysOfWeek 枚举中填充 ComboBox:
this.comboBox1.DataSource = Enum.GetValues(typeof(DayOfWeek));
然后就可以从ComboBox的SelectedItem属性中获取枚举值了:
DayOfWeek selected = (DayOfWeek)this.comboBox1.SelectedItem;
【讨论】:
除了其他(正确的和内置的)建议之外,还有一个有趣的第三方Enum<T> 类,它使使用枚举变得更好:
http://blog.logrythmik.com/post/Better-Enum-Parsing-using-Strongly-Typed-Generics.aspx
【讨论】:
您可以绑定到名称/值对列表,其中值是您的枚举。 更多的工作,但如果您需要,它将更容易支持本地化。这是一种方法:
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;
【讨论】:
这是我更喜欢的。如果解析失败,则需要处理。
// 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
}
【讨论】: