如何获得枚举值字符串或整型

如果我有枚举字符串或枚举整数值,我如何得到枚举值。如果我有一个枚举如下:

public enum TestEnum
{
Value1 = 1,
Value2 = 2,
Value3 = 3
}

在某个字符串变量中,值“ value1”如下所示:

string str = "Value1"

或者在一个整型变量中,类似的值为2

int a = 2;

如何获得 enum 的实例?我需要一个通用方法,在这个方法中,我可以提供枚举和我的输入字符串或 int 值来获得枚举实例。

345416 次浏览

下面是 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;
}

下面是 C # 中通过 int 获取枚举值的方法。

///
/// 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>();

不,你不需要泛型方法,这样简单多了:

MyEnum myEnum = (MyEnum)myInt;


MyEnum myEnum = (MyEnum)Enum.Parse(typeof(MyEnum), myString);

我认为它也会更快。

试试这个

  public static TestEnum GetMyEnum(this string title)
{
EnumBookType st;
Enum.TryParse(title, out st);
return st;
}

所以你可以

TestEnum en = "Value1".GetMyEnum();

如果使用 TryParseParseToObject方法,可能会简单得多。

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.");
}
return Enum.TryParse(str, true, out T val) ? val : default;
}


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,就可以很容易地使它成为一种扩展方法,这很方便。

试试这个

这是另一种方式

public enum CaseOriginCode
{
Web = 0,
Email = 1,
Telefoon = 2
}


public void setCaseOriginCode(string CaseOriginCode)
{
int caseOriginCode = (int)(CaseOriginCode)Enum.Parse(typeof(CaseOriginCode), CaseOriginCode);
}

有很多方法可以做到这一点,但是如果你想要一个简单的例子,这将做到这一点。它只需要增强必要的防御性编码,以检查类型安全和无效解析等。

    /// <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>();
}

从 SQL 数据库获取枚举类似于:

SqlDataReader dr = selectCmd.ExecuteReader();
while (dr.Read()) {
EnumType et = (EnumType)Enum.Parse(typeof(EnumType), dr.GetString(0));
....
}

下面是一个获取字符串/值的示例

    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

你可以用下面的方法来做到这一点:

public static Output GetEnumItem<Output, Input>(Input input)
{
//Output type checking...
if (typeof(Output).BaseType != typeof(Enum))
throw new Exception("Exception message...");


//Input type checking: string type
if (typeof(Input) == typeof(string))
return (Output)Enum.Parse(typeof(Output), (dynamic)input);


//Input type checking: Integer type
if (typeof(Input) == typeof(Int16) ||
typeof(Input) == typeof(Int32) ||
typeof(Input) == typeof(Int64))


return (Output)(dynamic)input;


throw new Exception("Exception message...");
}

注意: 此方法只是一个示例,可以进行改进。

正如 @ Phil B@ Kendall Frey回答的注释中所建议的那样,对于字符串可以非常简洁地做到这一点。

Enum.Parse<MyEnum>(myString);

因为 @ Kendall Frey回答增加了这个错误,给了我一个运行时错误,而 @ Phil B的修订版没有。

此时可以使用 Enum.TryParse 方法:

MyType myType;
bool isValidEnum = Enum.TryParse(yourStringValue, out myType);

如果“ yourStringValue”不是 MyType 枚举类型,则 isValidEnum 为 false。

问候。

Enum.valueOf(myEnum.class, myString)