13

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

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

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

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

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

4

7 回答 7

18

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

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

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

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

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

private enum GainValues { One = 1, Two = 2, Four = 4, Eight = 8 };
于 2010-06-01T18:21:58.100 回答
13

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

using System.ComponentModel.DataAnnotations;

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

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

于 2013-06-09T21:01:36.470 回答
6

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

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

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

希望这会有所帮助!

于 2012-11-11T14:41:11.383 回答
4
private enum GainValues { One = 1, Two = 2, Four = 4, Eight = 8 }

应该管用。

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

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

于 2010-06-01T18:21:02.703 回答
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 valueFromDB = 4;

GainValues enumVal = (GainValues) valueFromDB;

// enumVal should be 'Four' now
于 2010-06-01T18:21:53.560 回答
0

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

或者,您可以执行 Gain1、Gain2 等。

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

于 2010-06-01T18:22:02.717 回答
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页面:

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

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

希望这可以帮助

于 2010-06-01T20:15:53.663 回答