You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在C#中将字符串形式的枚举名称传入typeof()方法?

解决动态通过字符串获取枚举类型的问题

首先明确:typeof()方法只能接受类型字面量(比如typeof(UNH)),不能直接传字符串变量。要实现通过字符串名称获取枚举类型,你需要用Type.GetType()方法,再结合输入字符串的处理逻辑来完成。

1. 核心:通过字符串获取枚举类型

要获取对应名称的枚举类型,你需要传入枚举的完整类型名称(包括命名空间)给Type.GetType()。如果你的枚举和调用代码在同一个命名空间下,可以这样拼接:

// 假设你从输入提取的枚举名存在testname变量中
string testname = "ABC";
// 拼接完整类型名(这里的YourNamespace替换成你的枚举实际所在的命名空间)
string fullEnumTypeName = $"{typeof(UNH).Namespace}.{testname}";
// 获取枚举类型
Type enumType = Type.GetType(fullEnumTypeName);

拿到enumType后,就可以像操作普通枚举一样调用Enum类的静态方法了:

if (enumType != null && enumType.IsEnum)
{
    // 获取枚举值的数量
    int tagCount = Enum.GetNames(enumType).Length;
    // 获取所有枚举值
    Array enumValues = Enum.GetValues(enumType);
    // 遍历枚举值
    foreach (var value in enumValues)
    {
        Console.WriteLine($"枚举值:{value},对应数值:{(int)value}");
    }
}

注意:如果Type.GetType()返回null,大概率是因为你传入的类型名称不完整(漏了命名空间),或者枚举不在当前程序集里。如果枚举在其他程序集,可以用Assembly.Load("AssemblyName").GetType(fullEnumTypeName)来获取。

2. 处理输入字符串提取枚举名

对于格式为"ABC+anythinghere"的输入,你可以通过两种方式提取前3位(或分割出枚举名):

  • 方式1:直接截取前3个字符(适合确定枚举名固定为3位的场景)
    string input = "DEF+somedata";
    string testname = input.Substring(0, 3);
    
  • 方式2:按+分割字符串(更灵活,适合以后枚举名长度可能变化的情况)
    string input = "GHI+moredata";
    string testname = input.Split('+')[0];
    

3. 完整示例代码

把整个流程整合起来,假设你的枚举都在MyProject.Enums命名空间下:

namespace MyProject.Enums
{
    public enum UNH { Message_Reference_Identifier = 0, Message_Type = 1, Message_version_number = 2 }
    public enum ABC { ValA, ValB, ValC }
    public enum DEF { OptX, OptY }
    public enum GHI { Item1, Item2, Item3, Item4 }
}

// 调用逻辑
public void ProcessEnumInput(string input)
{
    // 提取枚举名
    string enumName = input.Split('+')[0];
    // 拼接完整类型名
    string fullTypeName = $"MyProject.Enums.{enumName}";
    Type enumType = Type.GetType(fullTypeName);

    if (enumType == null)
    {
        Console.WriteLine($"未找到名为{enumName}的枚举类型");
        return;
    }

    if (!enumType.IsEnum)
    {
        Console.WriteLine($"{enumName}不是枚举类型");
        return;
    }

    // 操作枚举
    int tagCount = Enum.GetNames(enumType).Length;
    Console.WriteLine($"枚举{enumName}共有{tagCount}个值:");
    foreach (var value in Enum.GetValues(enumType))
    {
        Console.WriteLine($"- {value} = {(int)value}");
    }
}

额外注意事项

  • 一定要做enumType的null检查,避免传入无效枚举名导致空引用异常。
  • 如果枚举在不同的程序集,需要指定程序集名称,比如Type.GetType("MyProject.Enums.ABC, MyProject")(逗号后是程序集名称)。
  • 如果你的枚举名称可能有大小写差异,可以在提取后转成大写/小写,再和类型名匹配(比如enumName = enumName.ToUpper())。

内容的提问来源于stack exchange,提问作者Rajas Pawaskar

火山引擎 最新活动