C#中如何通过索引拼接属性名循环访问类的属性?
解决C#动态访问类字段的"identifier expected"错误
你的代码报错是因为C#作为静态类型语言,不支持s.$"sub{i}"这种动态拼接标识符的语法——编译器无法识别这种运行时才确定的字段名,所以抛出"identifier expected"错误。下面提供几种可行的解决方案:
方案1:改用数组/集合(推荐)
从设计层面优化,把重复的sub1/sub2/sub3字段替换成数组或集合,这是最符合C#编码规范的做法,类型安全且性能最优:
public class SampleApplication { public static void Main(string[] args) { Student s = new Student(); for(int i = 0; i < s.Subjects.Length; i++) { s.Subjects[i] = "Subjects"; } } } public class Student { // 用数组存储3个科目,对应原有的sub1-sub3 public string[] Subjects = new string[3]; }
如果需要更灵活的长度,可以用List<string>:
public class Student { public List<string> Subjects = new List<string>(); } // 使用时先初始化元素再赋值 public static void Main(string[] args) { Student s = new Student(); // 先添加3个空元素 for(int i = 0; i < 3; i++) { s.Subjects.Add(string.Empty); } // 再循环赋值 for(int i = 0; i < s.Subjects.Count; i++) { s.Subjects[i] = "Subjects"; } }
方案2:使用反射(动态访问字段)
如果必须保留原有的sub1/sub2/sub3字段结构,可以用反射实现动态访问:
using System.Reflection; public class SampleApplication { public static void Main(string[] args) { Student s = new Student(); for(int i = 1; i <= 3; i++) { // 获取指定名称的字段信息 FieldInfo field = typeof(Student).GetField($"sub{i}"); // 给字段赋值 field.SetValue(s, "Subjects"); } } } public class Student { public string sub1; public string sub2; public string sub3; }
注意:反射的性能比直接访问字段差,适合字段数量少、动态需求强的场景。
方案3:使用switch映射索引与字段
如果字段数量很少且不想用反射,也可以用switch语句做索引到字段的映射:
public class SampleApplication { public static void Main(string[] args) { Student s = new Student(); for(int i = 1; i <= 3; i++) { switch(i) { case 1: s.sub1 = "Subjects"; break; case 2: s.sub2 = "Subjects"; break; case 3: s.sub3 = "Subjects"; break; } } } } public class Student { public string sub1; public string sub2; public string sub3; }
这种方案扩展性差,后续新增字段需要修改switch逻辑。
内容的提问来源于stack exchange,提问作者spc
相关产品推荐
相关产品推荐

