【问题标题】:How to use generic type in a value tuple?如何在值元组中使用泛型类型?
【发布时间】:2019-10-13 18:04:20
【问题描述】:

假设我有两个枚举:

    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) 我想将泛型与元组一起使用

2) 希望使用 Generic 能够基于该元组生成列表项

这可能吗?我不确定这个声明会是什么样子。在这一点上,我无法让它工作。有人能指出我正确的方向吗?

【问题讨论】:

    标签: c# generics enums tuples derived-class


    【解决方案1】:

    使它成为一个通用函数非常简单。您可以使用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】:

      您可以尝试以下通用方法。

      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();
      }
      

      输出:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-21
        • 2017-02-02
        • 2021-12-06
        • 2020-06-04
        • 2021-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多