Предположим, у меня есть два перечисления:

    public enum eFruits : int
    {
        Apple = 1,
        Pear = 2,
        Banana = 3
    }
    public enum eAnimals : int
    {
        Dog = 1,
        Cat = 2,
        Rabbit = 3
    }

Я хотел бы использовать их в выпадающих списках / контрольных списках и т.д .; в основном как listitems. Текущий код, который я имею в качестве попытки, это;

    public static class EnumHelper
    {     
        public static IEnumerable<(int eCode, eFruits eType)> GetFruitTypesAsListItems()
        {
            var enums = new List<(int eCode, eFruits eType)>();
            foreach (var item in (eFruits[])Enum.GetValues(typeof(eFruits)))
            {
                enums.Add(((int)item, item));
            }
            return enums;
        }
    }

Две проблемы с этим;

1) Я хотел бы иметь это в общем виде

2) Это не выглядит хорошо внутри списка / выпадающего списка и т. Д., Поэтому я хотел бы использовать переопределение ToString.

Поэтому я подумал о чем-то вроде этого:

    public class EnumListItem : Tuple<int, T>
    {
        public EnumListItem(int eCode, T eType) 
            : base(eCode, eType)
        { }

        public override string ToString() => $"{base.Item2.ToString()} ({base.Item1})";
    }

Так в действительности;

1) Я хотел бы использовать Generic с Tuple

2) Хотел бы использовать Generic, чтобы иметь возможность генерировать элементы списка на основе этого кортежа

Это возможно? Я не уверен, как будет выглядеть декларация об этом. На данный момент я не могу заставить его работать. Может ли кто-нибудь указать мне правильное направление?

2
Obelix 28 Май 2019 в 11:48

2 ответа

Лучший ответ

Вы можете попробовать ниже общий метод.

public static class EnumHelper<T>
{
    public static IEnumerable<(int eCode, T eType)> GetListItem()
    {
        var enums = new List<(int eCode, T eType)>();
        foreach (var item in (T[])Enum.GetValues(typeof(T)))
        {
            enums.Add((Convert.ToInt32(item), item));
        }
        return enums;
    }
}

И вы можете назвать это как,

public static void Main(string[] args)
{
    var animals = EnumHelper<eAnimals>.GetListItem();

    var fruits = EnumHelper<eFruits>.GetListItem();
}

Вывод:

enter image description here

enter image description here

3
er-sho 28 Май 2019 в 09:07

Сделать его универсальной функцией довольно просто. И вы могли бы использовать yield для возврата перечисляемого генератора вместо буферизованного List, чтобы избавиться от ненужного использования памяти.

public static IEnumerable<(int, TEnum)> GetValues<TEnum>()
where TEnum : struct, Enum
{
    foreach (var item in Enum.GetValues(typeof(TEnum)))
    {
        yield return ((int)item, (TEnum)item);
    }
}
2
Alsein 28 Май 2019 в 09:25
56338324