在 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();
C# 很酷,可以比较枚举,然后转换为字符串。我已经从 SO 获得了一些代码来枚举枚举的各个项目(下面 class 中的顶级方法)。然后,在第二种方法(我写的)中,当枚举与给定值匹配时,我设法转换为字符串。
第三种方法,希望大家帮忙。给定一个基于标志的枚举,其中给定值实际上是许多值 AND'ed 在一起,我想原子化这些值并转换为 List
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();