如何通过字符串变量引用对应名称的Dictionary实例?
如何通过字符串变量引用对应的Dictionary实例?
你当前代码里的newDict是方法内的局部变量,C#无法直接通过字符串名称直接引用局部变量,以下是两种可行的解决思路:
方案一:用容器字典管理目标字典
最直接且安全的方式是创建一个"字典的字典",把所有需要通过名称引用的字典实例存入其中,再通过字符串key获取目标字典:
static void Info(string option, string obj) { var newDict = new Dictionary<string, int>() { {"Test", 0}, {"Test2", 1} }; // 建立名称到字典实例的映射 var dictMap = new Dictionary<string, Dictionary<string, int>> { ["newDict"] = newDict }; // 通过obj参数获取对应字典 if (dictMap.TryGetValue(obj, out var targetDict)) { // 这里可以正常使用targetDict,比如遍历输出 foreach (var item in targetDict) { Console.WriteLine($"{item.Key}: {item.Value}"); } } else { Console.WriteLine($"不存在名为{obj}的字典"); } }
方案二:将字典改为类成员后用反射获取
如果能把newDict从局部变量改为类的字段/属性,可以通过反射根据名称获取实例,但反射性能较低且不够直观,仅适合成员变量场景:
public class DictHolder { // 将字典改为类的私有字段 private Dictionary<string, int> newDict = new Dictionary<string, int>() { {"Test", 0}, {"Test2", 1} }; static void Info(string option, string obj) { var holder = new DictHolder(); // 通过反射获取指定名称的字段 var field = typeof(DictHolder).GetField(obj, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); if (field != null) { var targetDict = field.GetValue(holder) as Dictionary<string, int>; if (targetDict != null) { // 使用获取到的字典 } } } }
注意:局部变量存储在栈内存中,C#反射无法直接访问,因此方案一才是局部变量场景下的最优解。
内容的提问来源于stack exchange,提问作者humu
相关产品推荐
相关产品推荐

