如何通过字符串名称调用变量?C#循环访问序列命名变量实现方法问询
解决方案
方案1:优先使用集合存储(推荐)
按序号命名的同类型变量天然适合用数组、List或字典存储,不需要使用反射,性能和可维护性都更好。示例实现:
// 数组长度设为6是为了跳过索引0,适配你1~5的序号使用习惯 DataPoint[] dps = new DataPoint[6]; string[] strs = new string[6]; // 引用类型需要先初始化实例 for(int i=1; i<=5; i++) { dps[i] = new DataPoint(); } // 循环执行业务逻辑 for(int i=1; i<=5; i++) { dps[i].Add(val1, val2); strs[i] = "MyStringValue"; }
如果序号不连续、跨度大,可以用字典实现:
Dictionary<int, DataPoint> dpDict = new Dictionary<int, DataPoint>(); Dictionary<int, string> strDict = new Dictionary<int, string>(); // 提前存入对应序号的变量后,循环根据key读取操作即可
方案2:反射实现(仅适用于变量为类成员、无法修改原有定义的场景)
注意:如果dp1、s1这类变量是方法内的局部变量,反射无法获取,只有类的字段/属性支持反射访问。
假设变量是类的公共实例字段,实现代码如下:
using System.Reflection; // 这里替换为你对应类的类型,this为类的实例对象 Type classType = typeof(你的类名); for(int i=1; i<=5; i++) { // 操作DataPoint类型变量 FieldInfo dpField = classType.GetField($"dp{i}", BindingFlags.Public | BindingFlags.Instance); DataPoint dp = dpField.GetValue(this) as DataPoint; dp.Add(val1, val2); // 操作字符串类型变量 FieldInfo strField = classType.GetField($"s{i}", BindingFlags.Public | BindingFlags.Instance); strField.SetValue(this, "MyStringValue"); }
如果是私有字段,把BindingFlags.Public替换为BindingFlags.NonPublic即可;如果是静态成员,把BindingFlags.Instance替换为BindingFlags.Static。
注意:反射性能远低于直接访问变量,且编译期不会校验成员是否存在,容易触发运行时错误,非必要不建议使用。
内容的提问来源于stack exchange,提问作者Mustafa Ozbalci
相关产品推荐
相关产品推荐

