如何将C#静态类的字符串常量属性转换为Dictionary?
将C#静态类中的字符串常量转为Dictionary的实现方法
有两种常用的实现方式,根据你的需求选就行:
方法一:反射自动生成字典(适合常量多、常更新的场景)
通过反射获取静态类里的所有const string字段,自动构建字典,不用手动维护:
using System; using System.Collections.Generic; using System.Reflection; public static class somename { public const string abc = "abc 1"; public const string xyz = "xyz 2"; public const string vhj = "vhj 3"; public static Dictionary<string, string> GetConstants() { var constantsDict = new Dictionary<string, string>(); // 获取类中所有公共静态字段 var fields = typeof(somename).GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy); foreach (var field in fields) { // 筛选出const类型的string字段 if (field.IsLiteral && !field.IsInitOnly && field.FieldType == typeof(string)) { constantsDict.Add(field.Name, field.GetValue(null) as string); } } return constantsDict; } } // 使用示例 class Program { static void Main() { var dict = somename.GetConstants(); foreach (var kvp in dict) { Console.WriteLine($"{kvp.Key}: {kvp.Value}"); } } }
说明
field.IsLiteral用来判断是不是编译期常量(const字段会被标记为Literal),!field.IsInitOnly是为了排除readonly字段(readonly是运行时初始化,不算const)- 新增常量时不用改字典代码,反射会自动识别
方法二:手动构建字典(适合常量少、不常变动的场景)
如果常量数量不多,直接手动写字典更直观,也没有反射的性能开销:
public static class somename { public const string abc = "abc 1"; public const string xyz = "xyz 2"; public const string vhj = "vhj 3"; // 手动维护的字典 public static readonly Dictionary<string, string> ConstantsDict = new Dictionary<string, string> { { nameof(abc), abc }, { nameof(xyz), xyz }, { nameof(vhj), vhj } }; } // 使用示例 foreach (var kvp in somename.ConstantsDict) { Console.WriteLine($"{kvp.Key}: {kvp.Value}"); }
说明
- 用
nameof()可以避免硬编码字段名,字段名修改时编译器会自动提示 - 缺点是新增或删除常量时,需要同步更新字典内容
内容的提问来源于stack exchange,提问作者Murtuza
相关产品推荐
相关产品推荐

