68

私は列挙型を持っています

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パラメータが認識されないため、機能しません。

4

10 に答える 10

97

使ってみませんか

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")
于 2012-11-06T10:19:52.393 に答える
62

自分で書く必要はありません:

    // 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
}
于 2012-11-06T10:19:36.300 に答える
11

この方法を使用するだけです

Enum.IsDefinedメソッド-指定された値を持つ定数が指定された列挙型に存在するかどうかの指示を返します

enum myEnum2 { ab, st, top, under, below};
myEnum2 value = myEnum2.ab;
 Console.WriteLine("{0:D} Exists: {1}", 
                        value, myEnum2.IsDefined(typeof(myEnum2), value));
于 2012-11-06T10:20:43.747 に答える
4

この場合、ToString()で行っていることは、次のとおりです。

Enum.GetValues(typeof(myEnum)).ToString()...代わりに、次のように書く必要があります。

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

違いは括弧内にあります...

于 2012-11-06T17:45:08.150 に答える
3

これも使用できます:

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

結果には、値が列挙型に含まれているかどうかが含まれます。

于 2012-11-06T11:03:33.760 に答える
3
   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());
    }
于 2012-11-06T14:11:02.753 に答える
3

あなたの質問が「私は列挙型を持っています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;
}

私が助けることができることを願っています。

于 2017-03-27T18:32:59.770 に答える
2

列挙型の正しい名前(myEnum2)を使用してください。

また、文字列値に対してテストする場合は、GetNamesの代わりに使用することをお勧めしますGetValues

于 2012-11-06T10:19:28.127 に答える
2

列挙型を次のようにキャストするだけです。

string something = (string)myEnum;

そして今、あなたが好きなように比較は簡単です

于 2012-11-06T10:22:29.500 に答える
1

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;
}
于 2012-11-06T10:25:36.363 に答える