在 C# 7.3 到来之前如何将泛型方法限制为枚举到 compile/work

Before C# 7.3 arrives how to get generic method constrained to Enums to compile/work

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

第三种方法,希望大家帮忙。给定一个基于标志的枚举,其中给定值实际上是许多值 AND'ed 在一起,我想原子化这些值并转换为 List。如果我有 C# 7.3,那么我认为将 限制为枚举可能有助于编译。到那时,如何才能实现将标志枚举分解为转换为字符串的原子值的目标。

public static class EnumUtil
{
    // JaredPar 
    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。

使用 where T : struct 并抛出 ArgumentException 如果不是 System.Enum:

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