Как использовать универсальный тип в кортеже значений? - PullRequest
2 голосов
/ 28 мая 2019

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

    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) Я хотел бы использовать универсальный с кортежем

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

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

Ответы [ 2 ]

3 голосов
/ 28 мая 2019

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

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

2 голосов
/ 28 мая 2019

Сделать его универсальной функцией довольно просто.И вы можете использовать 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);
    }
}
...