列挙型があります
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パラメーターが認識されないため、機能しません。
独自に記述する必要はありません:
// 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
}
なぜ使わない
Enum.IsDefined(typeof(myEnum), value);
[〜#〜] btw [〜#〜]汎用の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")
この方法を使用してください
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));
この場合、ToString()で行うことは次のとおりです。
Enum.GetValues(typeof(myEnum)).ToString()...
代わりに、次のように記述する必要があります。
Enum.GetValues(typeof(myEnum).ToString()...
違いは括弧にあります...
これも使用できます:
enum myEnum2 { ab, st, top, under, below }
static void Main(string[] args)
{
myEnum2 r;
string name = "ab";
bool result = Enum.TryParse(name, out r);
}
結果には、値が列挙に含まれているかどうかが含まれます。
あなたの質問が「私は列挙型を持っている、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;
}
私が助けてくれることを願っています。
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());
}
正しい列挙名(myEnum2
)。
また、文字列値をテストする場合は、GetNames
の代わりにGetValues
を使用することもできます。
列挙型を次のようにキャストします。
string something = (string)myEnum;
これで比較が簡単になりました
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;
}