You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过字符串名称调用变量?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 19:36:01