C# 在C7.3到来之前,如何将泛型方法约束到枚举以进行编译/工作

C# 在C7.3到来之前,如何将泛型方法约束到枚举以进行编译/工作,c#,enums,generic-method,C#,Enums,Generic Method,C很酷,它允许比较枚举,然后转换为字符串。我已经从下面的类中获得了一些代码来枚举Enum top方法的各个项。然后,在我编写的第二个方法中,当枚举与给定值匹配时,我设法将其转换为字符串 第三种方法,我想要一些帮助。给定一个基于标志的枚举,其中给定的值实际上是多个值并合并在一起,我想将这些值原子化并转换为一个列表。如果我使用的是C7.3,那么我认为限制使用枚举可能有助于编译。在此之前,如何实现将标志枚举分解为转换为字符串的原子值的目标 public static class EnumUtil {

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

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

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;
    }
}
无法通过C7.2

使用where T:struct,如果不是系统,则引发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.
}
使用where T:struct,如果不是系统,则引发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.
}

你为什么没有7.3呢?它现在可用…不,它不是框架版本,请转到“构建”选项卡,选择“高级”,然后选择语言版本。框架版本和语言版本是两种不同的东西。确保VisualStudio是最新的,它包括语言支持。我已经用了一个多月了。它不是.NETCore。。。我正在根据.NET Framework 4.6.2编译一个项目。这与.NET Core或framework版本无关,它是Visual Studio内部的构建设置,如果安装了最新版本的VS2017 15.7.4,则应显示C 7.3。好的,我现在得到了7.3。我想我现在没有借口了。我会再写一次我需要的逻辑。谢谢@Ronbeyer为什么你没有7.3?它现在可用…不,它不是框架版本,请转到“构建”选项卡,选择“高级”,然后选择语言版本。框架版本和语言版本是两种不同的东西。确保VisualStudio是最新的,它包括语言支持。我已经用了一个多月了。它不是.NETCore。。。我正在根据.NET Framework 4.6.2编译一个项目。这与.NET Core或framework版本无关,它是Visual Studio内部的构建设置,如果安装了最新版本的VS2017 15.7.4,则应显示C 7.3。好的,我现在得到了7.3。我想我现在没有借口了。我会再写一次我需要的逻辑。谢谢@RonBeyerThanks。标志枚举是一个数字。它需要通过循环遍历枚举项并测试它们的逻辑and’ing来拆分。Ooops!我最初的回答忽略了.ToString调用。如果您的标志enum看起来像public enum SomeEnum{yes=1,no=2,maybe=4};您有一个值,比如var myEnum=SomeEnum.yes | SomeEnum.maybe;那么myEnum.ToString最终可能是yes,而该表达式将是一个包含yes和maybeNo的字符串列表。由于我们的环境,我大约每个月或三个月都要写一次代码。我非常期待T:System.enum的位置,您的enum标记了[Flags]吗?那篇文章和随后的评论中的代码取自我的小测试程序。我错过.ToString调用的原因是选择/复制错误。啊!令人吃惊的谢谢标志枚举是一个数字。它需要通过循环遍历枚举项并测试它们的逻辑and’ing来拆分。Ooops!我最初的回答忽略了.ToString调用。如果您的标志enum看起来像public enum SomeEnum{yes=1,no=2,maybe=4};您有一个值,比如var myEnum=SomeEnum.yes | SomeEnum.maybe;那么myEnum.ToString最终可能是yes,而该表达式将是一个包含yes和maybeNo的字符串列表。由于我们的环境,我大约每个月或三个月都要写一次代码。我非常期待T:System.enum的位置,您的enum标记了[Flags]吗?那篇文章和随后的评论中的代码取自我的小测试程序。我错过.ToString调用的原因是选择/复制错误。啊!令人吃惊的