【问题标题】:How can I create an enum using numbers?如何使用数字创建枚举?
【发布时间】:2011-02-26 11:43:07
【问题描述】:

是否可以在 C# 中仅使用数字来创建枚举?在我的程序中,我有一个变量 Gain,它只能设置为 1、2、4 和 8。我正在使用 propertygrid 控件来显示和设置这个值。如果我要创建这样的枚举...

 private enum GainValues {One, Two, Four, Eight}

我将增益变量设为 GainValues 类型,然后属性网格中的下拉列表将仅显示增益变量的可用值。问题是我希望增益值以数字方式读取而不是单词。但我无法创建这样的枚举:

 private enum GainValues {1,2,4,8}

那么还有其他方法吗?也许创建一个自定义类型?

【问题讨论】:

    标签: c# grid properties numeric custom-type


    【解决方案1】:
    private enum GainValues { One = 1, Two = 2, Four = 4, Eight = 8 }
    

    应该可以。

    更新:好的,我想我误解了你。

    也许您可以使用KeyValuePair<string, int>,然后将名称和值分别绑定到 Key 和 Value 属性。

    【讨论】:

    • 尚不清楚这是否是 OP 正在寻找的。看起来他更像是想使用数字文字值作为枚举成员的 names - 这是非法的。
    • @LBushkin:鉴于描述,它可能是 OP 想要的。
    • @Henk:我不太确定,OP 写道:The problem is I want the gain values to read numerically an not as words. 我的解释是 OP 想要获得有限的有效值列表,而不是命名枚举。
    • 对,PropertyGrid 应用了 ToString()。也许描述属性可以帮助,我不确定:blogs.msdn.com/b/paulwhit/archive/2008/03/31/…
    • @ALL:基本上我希望属性网格中的下拉菜单仅显示 1、2、4 和 8 作为增益选项。
    【解决方案2】:

    在枚举中使用显式赋值:

    private enum GainValues 
    {
       One = 1, 
       Two = 2, 
       Four = 4, 
       Eight = 8
    }
    

    然后枚举这些值,如下所示:

    GainValues currentVal;
    
    foreach(currentVal in Enum.GetValues(typeof(GainValues))
    {
       // add to combo box (or whatever) here
    }
    

    然后您可以根据需要转换为/从整数:

    int valueFromDB = 4;
    
    GainValues enumVal = (GainValues) valueFromDB;
    
    // enumVal should be 'Four' now
    

    【讨论】:

      【解决方案3】:

      enums 不是这样工作的。 枚举允许您命名特定值,以便您可以在代码中更明智地引用它。

      如果你想限制有效数字的域,枚举可能不是正确的选择。另一种方法是创建一个有效值的集合用作收益:

      private int[] ValidGainValues = new []{ 1, 2, 4, 8};
      

      如果您想让它更安全,您甚至可以使用私有构造函数创建自定义类型,将所有有效值定义为静态的公共实例,然后以这种方式公开它们。但是您仍然必须为每个有效值指定一个名称 - 因为在 C# 中成员/变量名称不能以数字开头(尽管它们可以包含它们)。

      现在,如果您真正想要的是为 GainValues 枚举中的条目分配特定值,您可以这样做:

      private enum GainValues { One = 1, Two = 2, Four = 4, Eight = 8 };
      

      【讨论】:

      • 您可能希望将此静态设置为只读,根据范围要求可能是内部的或公开的,但是是的,这是最好的解决方案。
      • @Cylon Cat:是的,关于静态/只读的好点,虽然在实践中,你需要它是一个像 List 这样的集合而不是一个真正强制不变性的数组。
      【解决方案4】:

      不幸的是,C# 中的符号可以包含数字,但不能以数字开头。所以你将不得不使用单词。

      或者,你可以做 Gain1、Gain2 等。

      或者您可以完全放弃枚举并使用常量和内部处理。

      【讨论】:

        【解决方案5】:

        您可以使用一个自定义列表作为下拉列表的数据源。

        代码背后:

        using GainItem = KeyValuePair<string, int>;
        
        public partial class _Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    List<GainItem> dic = new List<GainItem>();
                    dic.Add(new GainItem("First", 1));
                    dic.Add(new GainItem("Second", 2));
                    dic.Add(new GainItem("Fourth", 4));
                    ddl.DataSource = dic;
                    ddl.DataBind();
                }
        
        
            }
        
            protected void btn_Click(object sender, EventArgs e)
            {
                Response.Write(ddl.SelectedValue);
            }
        }
        

        ASP 页面:

            <div>
            <asp:DropDownList runat="server" ID="ddl" DataValueField="Value" DataTextField="Key" />
            <asp:Button ID="btn" runat="server" OnClick="btn_Click" />
           </div>
        

        此外,您可以使用枚举来设置默认值,...

        希望对你有帮助

        【讨论】:

          【解决方案6】:

          如果我正确理解了原来的问题,答案可能是这样的:

          您可以通过简单地使用下划线前缀来获取检查器中枚举中列出的数字,例如:

          public enum MyNumbers{ _1, _2, _3, _4 };
          public MyNumbers myNumbers;
          

          希望对您有所帮助!

          【讨论】:

            【解决方案7】:

            对此已经有很多答案,但是我将提供另一种解决方案。如果你想让你的控件显示一个实际的数字,而不是你的控件中数字的英文单词,你可以使用数据注释。

            using System.ComponentModel.DataAnnotations;
            
            private enum GainValues 
            {
             [Display(Name = "1")]
             One,
             [Display(Name = "2")]
             Two,
             [Display(Name = "4")] 
             Four, 
             [Display(Name = "8")]
             Eight
            }
            

            这在程序中您想使用友好名称而不是成员的实际名称的任何地方都很有用。

            【讨论】:

              猜你喜欢
              • 2011-03-10
              • 2018-05-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-09-25
              相关资源
              最近更新 更多