Enum文字列またはenum int値がある場合、どうすればenum値を取得できますか。例:次のような列挙型がある場合:
public enum TestEnum
{
Value1 = 1,
Value2 = 2,
Value3 = 3
}
いくつかの文字列変数には、次のように値「value1」があります。
string str = "Value1"
またはいくつかのint変数に値2があります
int a = 2;
列挙型のインスタンスを取得するにはどうすればよいですか?列挙型と入力文字列またはint値を提供して列挙型インスタンスを取得できる汎用メソッドが必要です。
いいえ、一般的なメソッドは必要ありません。これははるかに簡単です:
MyEnum enum = (MyEnum)myInt;
MyEnum enum = (MyEnum)Enum.Parse(typeof(TestEnum), myString);
私もそれが速くなると思います。
これを行うには多くの方法がありますが、簡単な例が必要な場合はこれで十分です。型の安全性や無効な解析などをチェックするために必要な防御コーディングで強化する必要があるだけです。
/// <summary>
/// Extension method to return an enum value of type T for the given string.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <returns></returns>
public static T ToEnum<T>(this string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
/// <summary>
/// Extension method to return an enum value of type T for the given int.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <returns></returns>
public static T ToEnum<T>(this int value)
{
var name = Enum.GetName(typeof(T), value);
return name.ToEnum<T>();
}
TryParse
メソッドまたはParse
メソッドとToObject
メソッドを使用すると、はるかに簡単になります。
public static class EnumHelper
{
public static T GetEnumValue<T>(string str) where T : struct, IConvertible
{
Type enumType = typeof(T);
if (!enumType.IsEnum)
{
throw new Exception("T must be an Enumeration type.");
}
T val;
return Enum.TryParse<T>(str, true, out val) ? val : default(T);
}
public static T GetEnumValue<T>(int intValue) where T : struct, IConvertible
{
Type enumType = typeof(T);
if (!enumType.IsEnum)
{
throw new Exception("T must be an Enumeration type.");
}
return (T)Enum.ToObject(enumType, intValue);
}
}
@chrfinのコメントにあるように、便利なパラメータータイプの前にthis
を追加するだけで、非常に簡単に拡張メソッドにすることができます。
以下は、文字列で列挙値を取得するC#のメソッドです。
///
/// Method to get enumeration value from string value.
///
///
///
public T GetEnumValue<T>(string str) where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
{
throw new Exception("T must be an Enumeration type.");
}
T val = ((T[])Enum.GetValues(typeof(T)))[0];
if (!string.IsNullOrEmpty(str))
{
foreach (T enumValue in (T[])Enum.GetValues(typeof(T)))
{
if (enumValue.ToString().ToUpper().Equals(str.ToUpper()))
{
val = enumValue;
break;
}
}
}
return val;
}
以下は、intで列挙値を取得するC#のメソッドです。
///
/// Method to get enumeration value from int value.
///
///
///
public T GetEnumValue<T>(int intValue) where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
{
throw new Exception("T must be an Enumeration type.");
}
T val = ((T[])Enum.GetValues(typeof(T)))[0];
foreach (T enumValue in (T[])Enum.GetValues(typeof(T)))
{
if (Convert.ToInt32(enumValue).Equals(intValue))
{
val = enumValue;
break;
}
}
return val;
}
次のような列挙型がある場合:
public enum TestEnum
{
Value1 = 1,
Value2 = 2,
Value3 = 3
}
その後、上記の方法を次のように利用できます
TestEnum reqValue = GetEnumValue<TestEnum>("Value1"); // Output: Value1
TestEnum reqValue2 = GetEnumValue<TestEnum>(2); // OutPut: Value2
これが役立つことを願っています。
ジェネリック型の定義を忘れたと思う:
public T GetEnumValue<T>(int intValue) where T : struct, IConvertible // <T> added
そして、例えば次のように最も便利になるように改善できます:
public static T ToEnum<T>(this string enumValue) : where T : struct, IConvertible
{
return (T)Enum.Parse(typeof(T), enumValue);
}
その後、次のことができます:
TestEnum reqValue = "Value1".ToEnum<TestEnum>();
SQLデータベースから次のような列挙型を取得します。
SqlDataReader dr = selectCmd.ExecuteReader();
while (dr.Read()) {
EnumType et = (EnumType)Enum.Parse(typeof(EnumType), dr.GetString(0));
....
}
これを試してみてください
別の方法です
public enum CaseOriginCode
{
Web = 0,
Email = 1,
Telefoon = 2
}
public void setCaseOriginCode(string CaseOriginCode)
{
int caseOriginCode = (int)(CaseOriginCode)Enum.Parse(typeof(CaseOriginCode), CaseOriginCode);
}
記事へのコメントです
このようなものを試してください
public static TestEnum GetMyEnum(this string title)
{
EnumBookType st;
Enum.TryParse(title, out st);
return st;
}
だからできる
TestEnum en = "Value1".GetMyEnum();
文字列/値を取得する例を次に示します
public enum Suit
{
Spades = 0x10,
Hearts = 0x11,
Clubs = 0x12,
Diamonds = 0x13
}
private void print_suit()
{
foreach (var _suit in Enum.GetValues(typeof(Suit)))
{
int suitValue = (byte)(Suit)Enum.Parse(typeof(Suit), _suit.ToString());
MessageBox.Show(_suit.ToString() + " value is 0x" + suitValue.ToString("X2"));
}
}
Result of Message Boxes
Spade value is 0x10
Hearts value is 0x11
Clubs value is 0x12
Diamonds value is 0x13