Как создать перечисление с помощью чисел?

можно ли сделать перечисление, используя только числа в C#? В моей программе есть переменная Gain, которая может быть установлена только на 1, 2, 4 и 8. Я использую элемент управления propertygrid для отображения и установки этого значения. Если бы я создал такое перечисление...

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

и я сделал свою переменную усиления типа GainValues, тогда раскрывающийся список в propertygrid будет показывать только доступные значения для переменной усиления. Проблема в том, что я хочу, чтобы значения усиления считывались численно, а не как слова. Но я не могу создать перечисление, как это:

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

Итак, есть ли другой способ сделать это? Возможно создание пользовательского типа?

7 ответов


не так enums работа. перечисление позволяет вам назвать определенное значение, чтобы вы могли ссылаться на него в своем коде более разумно.

если вы хотите ограничить область допустимых чисел, перечисления могут быть неправильным выбором. альтернативой является просто создание коллекции допустимые значения что можно использовать как увеличения:

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

Если вы хотите сделать это более безопасным, вы даже можете создать пользовательский тип с частный конструктор определяет все допустимые значения как статические, общедоступные экземпляры, а затем предоставляет их таким образом. Но вам все равно придется дать каждому допустимому значению имя - так как в C# имена членов/переменных не могут начинаться с числа (хотя они могут содержать их).

теперь, если вы действительно хотите, чтобы назначить определенные значения для записей в перечислении GainValues, что вы можете сделать:

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

на это уже было много ответов, однако я предложу другое решение. Если вы хотите, чтобы ваш элемент управления отображал фактическое число, а не английское слово для числа в элементе управления, вы можете использовать аннотации данных.

using System.ComponentModel.DataAnnotations;

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

это полезно в любом месте вашей программы, где вы хотите использовать понятное имя, а не фактическое имя участника.


Если я правильно понял исходный вопрос, то ответ может быть такой:

вы можете получить номера, перечисленные в перечислении в инспекторе, просто используя префикс подчеркивания, e.g:

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

надеюсь, это поможет!


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

должны работать.

Update: хорошо, я думаю, что я неправильно понял вас там.

может быть, вы могли бы использовать KeyValuePair<string, int> и затем привязать имя и значение к свойству Key и Value соответственно.


к сожалению, символы в C# могут содержать числа, но не могут старт С цифрами. Так что тебе придется использовать слова.

альтернативно, вы можете сделать Gain1, Gain2 и т. д.

или вы можете вообще отказаться от перечисления и использовать константы и внутреннюю обработку.


используйте явное присвоение значения в перечислении:

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
}

тогда вы можете бросить в / из ints по мере необходимости:

int valueFromDB = 4;

GainValues enumVal = (GainValues) valueFromDB;

// enumVal should be 'Four' now

Вы можете использовать один пользовательский список как источник данных для выпадающего списка.

Код:

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>

кроме того, вы можете иметь перечисление для задания значения по умолчанию ...

надеюсь, что это помогает