好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#通过枚举的键名获取枚举值的源码

1. 使用 Enum.Parse 方法

将字符串直接转换为枚举值,适用于已知字符串与枚举名称严格匹配的场景。

using System;

public enum MyEnum

{

    ValueA = 1,

    ValueB = 2,

    ValueC = 3

}

public class Program

{

    static void Main()

    {

        string keyName = "ValueB"; // 枚举键名字符串

        // 转换方法

        MyEnum enumValue = (MyEnum)Enum.Parse(typeof(MyEnum), keyName);

        Console.WriteLine($"枚举值: {enumValue} ({(int)enumValue})");

        // 输出: 枚举值: ValueB (2)

    }

}

注意事项:

严格匹配:字符串必须与枚举名称完全一致(区分大小写)。

异常处理:如果字符串不匹配,会抛出 ArgumentException。建议结合 try-catch:

try

{

    var value = (MyEnum)Enum.Parse(typeof(MyEnum), keyName);

}

catch (ArgumentException)

{

    Console.WriteLine("无效的枚举名称");

}

2. 使用 Enum.TryParse 方法

安全转换方式,避免异常,推荐在不确定字符串是否合法时使用。

string keyName = "ValueC";

if (Enum.TryParse<MyEnum>(keyName, out MyEnum enumValue))

{

    Console.WriteLine($"转换成功: {enumValue}");

}

else

{

    Console.WriteLine("转换失败");

}

3. 忽略大小写匹配

允许字符串与枚举名称的大小写不敏感。

string keyName = "valueb"; // 小写

bool success = Enum.TryParse<MyEnum>(keyName, ignoreCase: true, out MyEnum value);

// success = true,value = MyEnum.ValueB

4. 处理包含数值的字符串

如果字符串是枚举值的数值(如 "2"),可直接转换为整数再映射。

string numericString = "2";

if (int.TryParse(numericString, out int numericValue))

{

    if (Enum.IsDefined(typeof(MyEnum), numericValue))

    {

        MyEnum value = (MyEnum)numericValue;

        Console.WriteLine(value); // ValueB

    }

}

5. 高级场景:反射遍历枚举

获取所有枚举键名与值的映射(例如生成字典)。

csharp

复制

var enumDict = Enum.GetValues(typeof(MyEnum))

                   .Cast<MyEnum>()

                   .ToDictionary(e => e.ToString(), e => e);

// 使用字典查询

string keyName = "ValueA";

if (enumDict.TryGetValue(keyName, out MyEnum value))

{

    Console.WriteLine(value); // ValueA

}

总结

场景 方法

确定字符串有效且合法 Enum.Parse

需要安全转换 Enum.TryParse

忽略大小写 Enum.TryParse + ignoreCase: true

预加载所有键值对 反射生成字典

字符串为数值格式 先转为 int,再通过 Enum.IsDefined 验证

完整代码示例

using System;

using System.Linq;

public enum MyEnum { ValueA = 1, ValueB = 2, ValueC = 3 }

public class Program

{

    static void Main()

    {

        // 示例1:安全转换(忽略大小写)

        string keyName = "valueb";

        if (Enum.TryParse<MyEnum>(keyName, ignoreCase: true, out MyEnum value))

        {

            Console.WriteLine($"转换成功: {value} ({(int)value})");

        }

        // 示例2:反射生成字典

        var enumDict = Enum.GetValues(typeof(MyEnum))

                           .Cast<MyEnum>()

                           .ToDictionary(e => e.ToString(), e => e);

        Console.WriteLine(string.Join(", ", enumDict)); 

        // 输出: [ValueA, 1], [ValueB, 2], [ValueC, 3]

    }

}

通过上述方法,可灵活处理从字符串到枚举值的转换,确保代码健壮性和可维护性。

实例,已测试

public HdhCmsGetEnumValue()

{

    string keyName = "purchase_price";

    if (Enum.TryParse<HdhCmsPriceType>(keyName, out HdhCmsPriceType enumValue))

    {

        MessageBox.Show($"转换成功: {(int)enumValue}");

    }

    else

    {

        MessageBox.Show("转换失败");

    }

}

public enum HdhCmsPriceType

{

    purchase_price = 1,

    quotation_price = 2,

    internet_price = 3

}


查看更多关于C#通过枚举的键名获取枚举值的源码的详细内容...

  阅读:24次