如何在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




