【问题标题】:CSharp Enumerate through nullable EnumsCSharp 通过可空枚举枚举
【发布时间】:2015-06-26 18:24:07
【问题描述】:

一段代码值一千字……

public enum enTest { a, b, c }

public void PrintEnum<T>()
{
    foreach (var E in Enum.GetValues(typeof(T)))
    Debug.WriteLine(E.ToString());
}

PrintEnum<enTest>();
PrintEnum<enTest?>();    // This will cause failure in Enum.GetValues()

上面是从一个更大的问题简化来说明失败的。

有谁知道当有人向我传递一个 Nullable Enum 时,我该如何迭代(或获取其中的所有值)?

提前致谢。

【问题讨论】:

  • Nullable.GetUnderLyingType 有帮助吗?
  • “一段代码值一千字...” - 但显示错误也会有很大帮助...以及在您的示例中使用常规名称。
  • 您有一个“可为空的 int”或“可为空的枚举”的误解。你不是真的,你有的是一个可以持有一个int,或者一个enum的类型,并且还有null的概念,但是这个类型既不是int也不是enum,它是一个可以为null的值,持有一个int或一个枚举。编译器中有编译器魔法来处理这个问题,并将可空类型值从表达式中的可空值中提升/提升。所以基本上,没有人给你一个可以为空的枚举,他们给你一个Nullable&lt;T&gt;,它不是一个枚举,但 T 是一个枚举。因此,您需要获得 T。
  • 正如@germi 所提到的,使用 nullable.GetUnderlyingType 会给你返回所需的类型,并且由于它返回 null 如果不是可空的,你可以简单地合并以保证正常使用的安全:@987654324 @
  • 一个附带问题是,如果该方法传递了一个包含枚举的Nullable&lt;T&gt;,该方法是否也应该将“null”打印为合法值?

标签: c# enums


【解决方案1】:

这个怎么样?

public static void PrintEnum<T>()
        {
            Type t = typeof (T);
            if (t.IsGenericType)
            {
                //Assume it's a nullable enum
                t = typeof (T).GenericTypeArguments[0];
            }

            foreach (var E in Enum.GetValues(t))
                Console.WriteLine(E.ToString());
        }

【讨论】:

  • 改进:t = t.Generic.... 以及 DavidG 对该问题的评论,使其更加简单。
  • Me.Name 的 Enum.GetValues(Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T)) 好多了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多