代码之家  ›  专栏  ›  技术社区  ›  S Meaden

在C 7.3到达之前,如何将泛型方法约束为要编译/工作的枚举

  •  0
  • S Meaden  · 技术社区  · 7 年前

    C很酷,允许比较枚举,然后转换为字符串。我已经从一些代码中获得了枚举枚举的各个项(下面类中的顶级方法)。然后,在第二个方法(我写的)中,当枚举与给定值匹配时,我设法将其转换为字符串。

    第三种方法,我想要一些帮助。给定一个基于标志的枚举,其中给定的值实际上是多个值并“组合在一起”,我希望原子化这些值并转换为列表<string>。如果我有C 7.3,那么我认为将<T>限制为枚举可能有助于编译。在此之前,如何实现将标志枚举分解为转换为字符串的原子值的目标。

    公共静态类枚举 { //jaredpar https://stackoverflow.com/questions/972307/can you loop through all enum values answer-972323 公共静态IEnumerable<t>getValues<t>() { 返回enum.getValues(typeof(t))。强制转换<t>(); } //S米登 public static string matchfirst<t>(t匹配此) { t[]值=(t[])enumutil.getValues<t>(); foreach(值中的t值) { if(matchethis.equals(val))。 { 返回val.ToString(); } } “返回”; } //S米登 //c 7.3 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters枚举约束 public static list<string>matchFlags<t>(t matchthis),其中t:system.enum list<string>flags=新列表<string>(); t[]值=(t[])enumutil.getValues<t>(); 长相匹配。 foreach(值中的t值) { 长lval=val; //如果(lMatchThis&lval) 如果(匹配此值) { flags.add(val.toString()); } } 返回标志; } } < /代码>

    无法通过C 7.2。

    .

    第三种方法,我想要一些帮助。给定一个基于标志的枚举,其中给定的值实际上是多个值并“组合在一起”,我希望原子化这些值并转换为列表<string>。如果我有C 7.3,那么我认为将<t>限制为枚举可能有助于编译。在此之前,如何实现将标志枚举分解为转换为字符串的原子值的目标。

    public static class EnumUtil
    {
        // JaredPar https://stackoverflow.com/questions/972307/can-you-loop-through-all-enum-values#answer-972323
        public static IEnumerable<T> GetValues<T>()
        {
            return Enum.GetValues(typeof(T)).Cast<T>();
        }
    
        // S Meaden
        public static string MatchFirst<T>  (T matchThis)
        {
            T[] values = (T[])EnumUtil.GetValues<T>();
            foreach (T val in values)
            {
                if (matchThis.Equals(val))
                {
                    return val.ToString();
                }
            }
            return "";
        }
    
        // S Meaden
        // C# 7.3 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters#enum-constraints
        public static List<string> MatchFlags<T> (T matchThis) where T : System.Enum
        {
            List<string> flags = new List<string>();
    
            T[] values = (T[])EnumUtil.GetValues<T>();
    
            long lMatchThis = (long)matchThis;
            foreach (T val in values)
            {
                long lVal = val;
                //if (lMatchThis & lVal)
                if (matchThis & val)
                {
                    flags.Add(val.ToString());
                }
            }
            return flags;
        }
    }
    

    无法通过C 7.2。

    1 回复  |  直到 7 年前
        1
  •  2
  •   S Meaden    7 年前

    使用 where T : struct 如果不是System.Enum,则引发ArgumentException:

    public static List<string> MatchFlags<T> (T matchThis) where T : struct
    {
        if (!(matchThis is System.Enum)) {
            throw new ArgumentException("Gotta be an enum");
        }
        //etc.
    }
    

    如果您有一个标志枚举,并且希望将其转换为 List<string> ,执行如下操作:

    matchThis.ToString().Split(',').ToList();