【问题标题】:Initialize enum with a null value用空值初始化枚举
【发布时间】:2012-11-28 12:40:50
【问题描述】:

如何创建一个空值的枚举

例如:

public enum MyEnum
{
    [StringValue("X")]
    MyX,
    [StringValue("Y")]
    MyY,      
    None
}

其中 None 值为 null 或 String.Empty

【问题讨论】:

标签: c# .net


【解决方案1】:

你可以试试这样的:-

public MyEnum? value= null;

或者你可以试试这个:-

 public MyEnum value= MyEnum.None;

【讨论】:

  • 虽然他的问题要求得到那个答案,但这不是他要问的。
  • 我认为 OP 要求枚举成员具有 null 值。
  • @jsobo 他们的要求是不可能的;这很好作为答案 IMO
  • 抱歉这么迟钝。答案肯定回答了所问的问题。但是我坚信问题实际上是关于如何允许 MyEnum.None 具有 string.empty 的 StringValue。
【解决方案2】:

正如所有其他答案所说,您不能将枚​​举值设为空。 您可以做的是添加一个具有空值的Description 属性(如您的StringValue)。

例如:

public enum MyEnum
{
    [Description(null)]
    None = 0,
    [Description("X")]
    MyX,
    [Description("Y")]
    MyY
}

您可以通过以下函数获取 Enum 的描述:

    public static string GetEnumDescription(Enum value)
    {
        FieldInfo fi = value.GetType().GetField(value.ToString());

        DescriptionAttribute[] attributes =
            (DescriptionAttribute[])fi.GetCustomAttributes(
            typeof(DescriptionAttribute),
            false);

        if (attributes != null && attributes.Length > 0)
            return attributes[0].Description;
        else
            return value.ToString();
    }

用法:

MyEnum e = MyEnum.None;
string s2 = GetEnumDescription((MyEnum)e); // This returns null

【讨论】:

    【解决方案3】:

    使用“?”可空类型的操作符!!

    public MyEnum? myEnum= null;
    

    【讨论】:

      【解决方案4】:

      所有枚举类型都是值类型,不同的成员也是从成员类型派生的(允许的类型有bytesbyteshortushortintuint、@987654329 @ 或 ulong - 就像 documented)。

      这意味着枚举的成员不能是null

      处理默认enum 值的一种方法是将None 值作为第一个值并将其设置为负值(对于有符号枚举)或0

      public enum MyEnum
      {
          [StringValue(null)]
          None = -1,
          [StringValue("X")]
          MyX,
          [StringValue("Y")]
          MyY      
      }
      

      如果您声明一个可为空的实例 - myenum?,则您可以拥有对枚举的 null 引用。

      【讨论】:

      • None 的值应始终为 0。
      • @erikkallen - 为什么它应该总是 0。它也可以是 -1,它实际上可以是任何值,在给定的情况下实际上不可能是一个真正的值。
      • 因为枚举的默认初始化程序会将枚举设置为(MyEnum)0FxCop agrees。也许 None 不应该总是默认的,例如。如果你有一个“否定选项”的枚举,也许All 应该是默认值。
      【解决方案5】:

      没有“具有空值的枚举”之类的东西。 C# 中的枚举只是一个命名整数。在您的情况下,None 只是 2 的别名(为了完整性,MyX0MyY1)。默认情况下,枚举的底层数据类型是int,但它也可以是其他基于整数的不同大小/符号的原始类型。

      如果你想要一个“空”枚举,你必须使用MyEnum?,也就是Nullable<MyEnum>

      【讨论】:

        猜你喜欢
        • 2013-06-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多