如何通过字符串或int获取枚举值

本文关键字:获取 枚举 int 何通过 字符串 | 更新日期: 2023-09-27 18:02:28

如果我有enum字符串或enum int值,我如何获得enum值。如果我有一个enum,如下所示:

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

和在一些字符串变量我有值"value1"如下:

string str = "Value1" 

或者在某个int变量中,值是2,比如

int a = 2;

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

如何通过字符串或int获取枚举值

不,你不需要一个泛型方法。这就简单多了:

MyEnum myEnum = (MyEnum)myInt;
MyEnum myEnum = (MyEnum)Enum.Parse(typeof(MyEnum), 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>();
    }

如果您使用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来轻松地使其成为扩展方法,这很方便。

正如@Phil B在@Kendall Frey回答的评论中建议的那样,对于字符串来说,这可以非常简洁地完成。

Enum.Parse<MyEnum>(myString);

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

下面是c#中通过字符串

获取enum值的方法
///
/// 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获取enum值的方法。

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

如果我有一个enum,如下所示:

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

试试这样

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

所以你可以输入

TestEnum en = "Value1".GetMyEnum();

试试这个

这是另一种方式

public enum CaseOriginCode
{
    Web = 0,
    Email = 1,
    Telefoon = 2
}
public void setCaseOriginCode(string CaseOriginCode)
{
    int caseOriginCode = (int)(CaseOriginCode)Enum.Parse(typeof(CaseOriginCode), CaseOriginCode);
}

从SQL数据库获取enum:

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

现在可以使用Enum了。TryParse方法:

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

如果"yourStringValue"如果不是MyType枚举类型,则isvalidum为false。

问候。

下面是获取字符串/值

的示例
    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...");
    }

注意:这个方法只是一个示例,你可以改进它

Enum.valueOf(myEnum.class, myString)