【问题标题】:C# enum contains valueC# 枚举包含值
【发布时间】:2012-10-26 06:40:40
【问题描述】:

我有一个枚举

enum myEnum2 { ab, st, top, under, below}

我想写一个函数来测试给定的值是否包含在 myEnum 中

类似的东西:

private bool EnumContainValue(Enum myEnum, string myValue)
{
     return Enum.GetValues(typeof(myEnum))
                .ToString().ToUpper().Contains(myValue.ToUpper()); 
}

但它不起作用,因为 myEnum 参数无法识别。

【问题讨论】:

  • 别忘了标记已接受的答案
  • 您能否详细说明为什么以下答案都没有解决您的问题?也许然后社区可以提供一个这样做的,你可以成为一个好的用户并将其标记为如此。

标签: c# enums contains


【解决方案1】:

为什么不使用

Enum.IsDefined(typeof(myEnum), value);

顺便说一句很高兴创建通用的 Enum<T> 类,它包含对 Enum 的调用(实际上我想知道为什么没有将这样的东西添加到 Framework 2.0 或更高版本中):

public static class Enum<T>
{
    public static bool IsDefined(string name)
    {
        return Enum.IsDefined(typeof(T), name);
    }

    public static bool IsDefined(T value)
    {
        return Enum.IsDefined(typeof(T), value);
    }

    public static IEnumerable<T> GetValues()
    {
        return Enum.GetValues(typeof(T)).Cast<T>();
    }
    // etc
}

这允许避免所有这些typeof 的东西并使用强类型值:

Enum<StringSplitOptions>.IsDefined("None")

【讨论】:

  • 为什么不让方法通用而不是类呢?不错的小扩展方法会很棒..
  • @nawfal non-generic Enum 类已存在于 C# 中。对我来说,Enum&lt;StringSplitOptions&gt;.GetValues() 也比 Enum.GetValues&lt;StringSplitOptions&gt;() 更具可读性
  • 我同意Enum&lt;StringSplitOptions&gt;.GetValues() 更具可读性,但Enum.GetValues&lt;StringSplitOptions&gt;() 主要是在框架中看到的,因此后者感觉很自在。就像Enum.TryParse&lt;&gt;Tuple.Create&lt;&gt;。可能是因为在静态类Enum&lt;T&gt;T 的有效性仅适用于您调用它的静态方法,因此必须对方法而不是类进行更合乎逻辑的约束。此外,对类级别的约束也感觉不太好当范围仅限于(后续的、静态的)方法调用时是多余的。使用Enum.GetValues&lt;StringSplitOptions&gt;() 的意图非常明确。
  • 我个人更喜欢Enum&lt;StringSplitOptions&gt;.GetValues(),只是在框架中很难看到..
  • @lazyberezovsky 你能在T 上添加一个where T : struct, IComparable, IFormattable, IConvertible 约束吗?会很好的。
【解决方案2】:

无需自己编写:

    // Summary:
    //     Returns an indication whether a constant with a specified value exists in
    //     a specified enumeration.
    //
    // Parameters:
    //   enumType:
    //     An enumeration type.
    //
    //   value:
    //     The value or name of a constant in enumType.
    //
    // Returns:
    //     true if a constant in enumType has a value equal to value; otherwise, false.

    public static bool IsDefined(Type enumType, object value);

例子:

if (System.Enum.IsDefined(MyEnumType, MyValue))
{
    // Do something
}

【讨论】:

    【解决方案3】:

    就用这个方法

    Enum.IsDefined Method - 返回指定枚举中是否存在具有指定值的常量的指示

    例子

    enum myEnum2 { ab, st, top, under, below};
    myEnum2 value = myEnum2.ab;
     Console.WriteLine("{0:D} Exists: {1}", 
                            value, myEnum2.IsDefined(typeof(myEnum2), value));
    

    【讨论】:

      【解决方案4】:

      在这种情况下,您使用 ToString() 所做的是:

      Enum.GetValues(typeof(myEnum)).ToString()... 你应该写:

      Enum.GetValues(typeof(myEnum).ToString()...
      

      区别就在括号里……

      【讨论】:

      • 请突出显示您建议的答案中缺少的第二个括号(在 myEnum 之后)。
      【解决方案5】:

      也可以这样用:

          enum myEnum2 { ab, st, top, under, below }
          static void Main(string[] args)
          {
              myEnum2 r;
              string name = "ab";
              bool result = Enum.TryParse(name, out r);
          }
      

      结果将包含该值是否包含在枚举中。

      【讨论】:

        【解决方案6】:
           public static T ConvertToEnum<T>(this string value)
            {
                if (typeof(T).BaseType != typeof(Enum))
                {
                    throw new InvalidCastException("The specified object is not an enum.");
                }
                if (Enum.IsDefined(typeof(T), value.ToUpper()) == false)
                {
                    throw new InvalidCastException("The parameter value doesn't exist in the specified enum.");
                }
                return (T)Enum.Parse(typeof(T), value.ToUpper());
            }
        

        【讨论】:

          【解决方案7】:

          如果您的问题类似于“我有一个枚举类型 enum MyEnum { OneEnumMember, OtherEnumMember },并且我想要一个函数来判断此枚举类型是否包含具有特定名称的成员,那么您正在寻找的是System.Enum.IsDefined 方法:

          Enum.IsDefined(typeof(MyEnum), MyEnum.OneEnumMember); //returns true
          Enum.IsDefined(typeof(MyEnum), "OtherEnumMember"); //returns true
          Enum.IsDefined(typeof(MyEnum), "SomethingDifferent"); //returns false
          

          如果您的问题类似于“我有一个枚举类型的实例,它具有Flags 属性,并且我想要一个函数来告诉该实例是否包含特定的枚举值,那么该函数看起来像像这样:

          public static bool ContainsValue<TEnum>(this TEnum e, TEnum val) where Enum: struct, IComparable, IFormattable, IConvertible
          {
              if (!e.GetType().IsEnum)
                  throw new ArgumentException("The type TEnum must be an enum type.", nameof(TEnum));
          
              dynamic val1 = e, val2 = val;
              return (val1 | val2) == val1;
          }
          

          希望我能帮上忙。

          【讨论】:

            【解决方案8】:

            使用正确的枚举名称 (myEnum2)。

            此外,如果您针对字符串值进行测试,您可能希望使用 GetNames 而不是 GetValues

            【讨论】:

              【解决方案9】:

              只需将枚举转换为:

              string something = (string)myEnum;
              

              现在比较容易,随心所欲

              【讨论】:

                【解决方案10】:

                我认为你在使用 ToString() 时出错了。

                尝试进行 Linq 查询

                private bool EnumContainValue(Enum myEnum, string myValue)
                {
                    var query = from enumVal in Enum.GetNames(typeof(GM)).ToList()
                                       where enumVal == myValue
                                       select enumVal;
                
                    return query.Count() == 1;
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2023-03-04
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-04-01
                  • 2016-03-05
                  相关资源
                  最近更新 更多