如何在C#中以变量值作为另一变量的名称/访问器?
在C#中实现Perl式动态变量访问(无需反射)
C#作为静态类型语言,没有Perl那种直接通过字符串变量解引用另一个变量的语法,但不用反射的话,有两种简洁实用的替代方案,能满足你动态创建和访问变量的需求。
先回顾你给出的Perl示例:
$string = "unknown until runtime"; $TargetVariableName = "string"; print $$TargetVariableName; # 实际等同于print $string,注意双$符号 # 输出:unknown until runtime
方案1:使用Dictionary<string, object>模拟动态变量映射
这是最直接的实现方式,用字典的键对应变量名,值对应变量内容:
// 用字典存储所有需要动态访问的"变量" var dynamicVars = new Dictionary<string, object>(); dynamicVars["string"] = "unknown until runtime"; string targetVariableName = "string"; // 通过字符串键直接访问对应的值 Console.WriteLine(dynamicVars[targetVariableName]); // 输出:unknown until runtime // 动态创建新"变量"也很简单 dynamicVars["numberValue"] = 123; Console.WriteLine(dynamicVars["numberValue"]);
方案2:使用ExpandoObject结合dynamic(类对象风格)
如果需要像访问普通对象属性一样操作,同时支持动态键访问,可以用ExpandoObject:
dynamic dynamicObj = new ExpandoObject(); // 像普通对象属性一样赋值 dynamicObj.string = "unknown until runtime"; string targetVariableName = "string"; // 将ExpandoObject转为字典,通过键访问 var objDict = (IDictionary<string, object>)dynamicObj; Console.WriteLine(objDict[targetVariableName]); // 输出:unknown until runtime // 动态添加新属性 dynamicObj.anotherProperty = "dynamic new value"; // 既可以用属性访问,也可以用字典键访问 Console.WriteLine(dynamicObj.anotherProperty); Console.WriteLine(objDict["anotherProperty"]);
这两种方案都不需要依赖反射,代码简洁易读,且性能比反射更优,完全能实现你想要的动态变量创建和访问功能。
内容的提问来源于stack exchange,提问作者MisterNad
相关产品推荐
相关产品推荐

