如何使用数字创建枚举?

时间:2010-06-01 18:19:02

标签: c# grid properties numeric custom-type

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

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

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

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

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

7 个答案:

答案 0 :(得分:16)

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

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

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

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

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

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

答案 1 :(得分:10)

已经有很多答案,但我会提供另一种解决方案。如果您希望控件显示实际数字而不是控件中数字的英文单词,则可以使用数据注释。

using System.ComponentModel.DataAnnotations;

private enum GainValues 
{
 [Display(Name = "1")]
 One,
 [Display(Name = "2")]
 Two,
 [Display(Name = "4")] 
 Four, 
 [Display(Name = "8")]
 Eight
}

这在您希望使用友好名称而不是成员实际名称的程序中的任何位置都很有用。

答案 2 :(得分:5)

如果我正确理解原始问题,答案可能是:

您只需使用下划线前缀即可在检查器中的枚举中列出数字,例如:

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

希望这有帮助!

答案 3 :(得分:4)

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

应该有用。

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

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

答案 4 :(得分:0)

在枚举中使用显式值赋值:

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开始:

int valueFromDB = 4;

GainValues enumVal = (GainValues) valueFromDB;

// enumVal should be 'Four' now

答案 5 :(得分:0)

不幸的是,C#中的符号可以包含数字,但不能用数字启动。所以你必须使用单词。

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

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

答案 6 :(得分:0)

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

代码背后:

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 Page:

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

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

希望这会有所帮助