【问题标题】:Match string to enumeration?将字符串与枚举匹配?
【发布时间】:2009-12-22 17:14:33
【问题描述】:

我正在使用第 3 方 DLL,它需要在方法签名中调用一个名为“DaysOfWeek”的枚举。

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

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

谢谢!

【问题讨论】:

  • 你试过什么?一些解决方案可能比其他解决方案更优雅,但这似乎是一个将一个映射到另一个的简单问题。

标签: c#


【解决方案1】:
Enum.Parse(typeof(DaysOfWeek), yourStringValue, true);

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我知道你刚刚做了第二部分作为如何做的例子,但是如果你可以做一个下拉列表,为什么你还需要用户输入枚举类型的值即时验证?
    • 也许在你不是从组合框驱动它的情况下,但可能是从命令行参数。我很欣赏这不是提出的具体问题,但这些信息对我来说肯定是有用的!
    【解决方案3】:

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

    ComboBox cb = new ComboBox();
    
    cb.Items.AddRange(Enum.GetNames(typeof(DaysOfWeek));
    
    (DaysOfWeek)Enum.Parse(typeof(DaysOfWeek), cb.SelectedText);
    

    【讨论】:

      【解决方案4】:

      很抱歉交叉引用,但在我的分析器中,有一个名为 EnumPair<T> 的辅助类 您可以使用它来填充 ComboBox 并让枚举的值返回以供进一步使用。

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

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

      这里是原文posting

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          创建一个如下所示的类:

          public class DayOfWeekComboBoxItem
          {
             public string Day{get;set;}
             public DayOfWeek DayOfWeek{get;set;}
          
             public override ToString()
             {
                return this.Date;
             }
          }
          

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

          【讨论】:

            【解决方案7】:

            您可以对 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;
            

            【讨论】:

              【解决方案8】:

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

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

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

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

              【讨论】:

                【解决方案9】:

                除了其他(正确的和内置的)建议之外,还有一个有趣的第三方Enum&lt;T&gt; 类,它使使用枚举变得更好:

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

                【讨论】:

                  【解决方案10】:

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

                  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;
                  

                  【讨论】:

                    【解决方案11】:

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

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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-09-17
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多