如何在值元组中使用泛型?
How to use generic type in a value tuple?
假设我有两个枚举:
public enum eFruits : int
{
Apple = 1,
Pear = 2,
Banana = 3
}
public enum eAnimals : int
{
Dog = 1,
Cat = 2,
Rabbit = 3
}
我想在 dropdownlists/checklists 等中使用这些;基本上作为列表项。我目前的试用代码是这样的;
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) 它在 list/dropdown 等内部看起来不太好,所以我想使用 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) 想要使用泛型来生成基于该元组的列表项
这可能吗?我不确定这个声明会是什么样子。在这一点上,我无法让它工作。有人能指出我正确的方向吗?
您可以尝试以下通用方法。
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
到 return 可枚举生成器而不是缓冲 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);
}
}
假设我有两个枚举:
public enum eFruits : int
{
Apple = 1,
Pear = 2,
Banana = 3
}
public enum eAnimals : int
{
Dog = 1,
Cat = 2,
Rabbit = 3
}
我想在 dropdownlists/checklists 等中使用这些;基本上作为列表项。我目前的试用代码是这样的;
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) 它在 list/dropdown 等内部看起来不太好,所以我想使用 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) 想要使用泛型来生成基于该元组的列表项
这可能吗?我不确定这个声明会是什么样子。在这一点上,我无法让它工作。有人能指出我正确的方向吗?
您可以尝试以下通用方法。
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
到 return 可枚举生成器而不是缓冲 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);
}
}