Предположим, у меня есть два перечисления:
public enum eFruits : int
{
Apple = 1,
Pear = 2,
Banana = 3
}
public enum eAnimals : int
{
Dog = 1,
Cat = 2,
Rabbit = 3
}
Я хотел бы использовать их в выпадающих списках/контрольных списках и т. д.; в основном как элементы списка. Текущий код, который у меня есть в качестве пробы, таков:
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, чтобы иметь возможность генерировать элементы списка на основе этого кортежа.
Это возможно? Я не уверен, как будет выглядеть объявление об этом. На данный момент я не могу заставить его работать. Может ли кто-нибудь указать мне в правильном направлении?
Вы можете попробовать ниже общий метод.
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();
}
Выход:
Это довольно просто сделать универсальной функцией. И вы можете использовать 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);
}
}