Как я могу присвоить значения перечисления списку в.NET 1.1 на Compact Framework?

Из http://weblogs.asp.net/stevewellens/archive/2009/08/19/how-to-fill-a-listbox-dropdownlist-from-an-enum.aspx я вижу этот пример для назначения значений перечисления список:

Array Values = System.Enum.GetValues(EnumType);

foreach (int Value in Values)
{
    string Display = Enum.GetName(EnumType, Value);
    ListItem Item = new ListItem(Display, Value.ToString());
    TheListBox.Items.Add(Item);
}

Однако в моем проекте Windows CE (.NET 1.1) нет "System.Enum.GetValues ​​()"; есть "GetUnderlyingType" и "ToObject"...

Является ли один из них ключом к достижению этого?

ОБНОВИТЬ

При попытке реализовать код Джона Скита, объявление "ListItem" завершается неудачно: "Не удалось найти тип или имя пространства имен" ListItem "(отсутствует директива using или ссылка на сборку?)"

Я использую OpenNETCF. Итак, VS предлагает добавить "OpenNETCF.Windows.Forms.ListItem" в мой блок использования. Но когда я это делаю, он потом жалуется на часть конструктора той же строки (ListItem item = new ListItem(field.Name, value.ToString());) с: "Лучший перегруженный метод соответствует для OpenNETCF.Windows.Forms.ListItem.ListItem(string, int)'имеет недопустимые аргументы "

Весь обработчик теперь:

private void PrinterPickerForm_Load(object sender, System.EventArgs e)
{
    // Got this from Jon Skeet (http://stackru.com/questions/17952900/how-can-i-assign-enum-values-to-a-listbox-in-net-1-1)
    Type type = typeof(PrintUtils.BeltPrinterType);
    foreach (FieldInfo field in type.GetFields(BindingFlags.Static | BindingFlags.Public))
    {
        // Fortunately unboxing to the enum's underlying field type works
        int value = (int) field.GetValue(null);
        ListItem item = new ListItem(field.Name, value.ToString());
        listBoxBeltPrinters.Items.Add(item);
    }
}

ОБНОВЛЕНИЕ 2

Это работает:

private void PrinterPickerForm_Load(object sender, System.EventArgs e)
{
    Type type = typeof(PrintUtils.BeltPrinterType);
    foreach (FieldInfo field in type.GetFields(BindingFlags.Static | BindingFlags.Public))
    {
        string display = field.GetValue(null).ToString();
        listBoxBeltPrinters.Items.Add(display);
    }
}

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

private void listBoxBeltPrinters_SelectedIndexChanged(object sender, System.EventArgs e)
{
    //Tried to do something more "el[egant,oquent]" but .NET 1.1 seems to be holding me back
    // http://stackru.com/questions/17953173/how-can-i-assign-the-value-selected-in-a-listbox-to-an-enum-var/17953297?noredirect=1#17953297
    string sel = listBoxBeltPrinters.SelectedItem.ToString();
    if (sel == "Zebra QL220")
    {
        PrintUtils.printerChoice = PrintUtils.BeltPrinterType.ZebraQL220;
    }
    else if (sel == "ONiel")
    {
        PrintUtils.printerChoice = PrintUtils.BeltPrinterType.ONiel;
    }
    //else if ( . . .)
}

2 ответа

Решение

Прошло много времени с тех пор, как я использовал Compact Framework, но я подозреваю, что самый простой подход - просто получить значения полей - и, конечно, где-то их хранить:

Type type = typeof(EnumType);
foreach (FieldInfo field in type.GetFields(BindingFlags.Static |
                                           BindingFlags.Public))
{
    // Fortunately unboxing to the enum's underlying field type works
    int value = (int) field.GetValue(null);
    ListItem item = new ListItem(field.Name, value.ToString());
    TheListBox.Items.Add(item);
}

Вы можете создать свой собственный GetValues метод. Из этого блога

private static int[] GetValues(Type enumType)
{
    if (enumType.BaseType == typeof (Enum))
    {
        //get the public static fields (members of the enum)
        var fi = enumType.GetFields(BindingFlags.Static | BindingFlags.Public);
        //create a new enum array
        var values = new int[fi.Length];
        //populate with the values
        for (var iEnum = 0; iEnum < fi.Length; iEnum++)
        {
            values[iEnum] = (int) fi[iEnum].GetValue(null);
        }
        //return the array
        return values;
    }

    //the type supplied does not derive from enum
    throw new ArgumentException("enumType parameter is not a System.Enum");
}
Другие вопросы по тегам