如何实现类属性的数组式便捷读写,结合枚举高效管理数据?
问题分析与解决方案
你当前的Data类中,data属性每次调用get都会返回一个新的数组副本,所以修改数组元素只会改变副本的值,无法同步到类内部的age、salary等字段,这就是设置数据失败的核心原因。
结合你想用枚举实现数组式访问的需求,最直接的解决方案是给Data类添加索引器,这样就能像操作数组一样通过枚举(或int索引)直接读写类的字段。
具体实现步骤
1. 定义枚举类型
先定义对应字段的枚举,方便统一跟踪数据类型:
public enum DataTypeEnum { Age, Salary, BooksOwned // 扩展你的8种数据类型对应的枚举值 }
2. 修改Data类,添加索引器
通过索引器实现枚举/索引到字段的映射,同时支持读写操作:
public class Data { // 你的字段(实际可扩展为8种不同类型) int age; int salary; int booksOwned; // 示例:如果有其他类型字段,比如string name; // 枚举类型索引器(核心实现) public object this[DataTypeEnum type] { get { return type switch { DataTypeEnum.Age => age, DataTypeEnum.Salary => salary, DataTypeEnum.BooksOwned => booksOwned, // 其他枚举值对应字段,不同类型直接返回即可 // DataTypeEnum.Name => name, _ => throw new ArgumentOutOfRangeException(nameof(type), "无效的数据类型枚举值") }; } set { switch (type) { case DataTypeEnum.Age: age = (int)value; break; case DataTypeEnum.Salary: salary = (int)value; break; case DataTypeEnum.BooksOwned: booksOwned = (int)value; break; // 其他枚举值对应字段赋值,注意匹配类型转换 // case DataTypeEnum.Name: // name = (string)value; // break; default: throw new ArgumentOutOfRangeException(nameof(type), "无效的数据类型枚举值"); } } } // 可选:重载int索引器,支持直接用(int)enum访问 public object this[int index] { get => this[(DataTypeEnum)index]; set => this[(DataTypeEnum)index] = value; } // 构造函数 public Data(int age, int salary, int booksOwned) { this.age = age; this.salary = salary; this.booksOwned = booksOwned; } }
3. 实现你需要的Increase方法
现在可以直接通过索引器访问字段,实现你想要的逻辑:
public bool Increase(Data data, DataTypeEnum dataTypeEnum) { // 若字段类型统一为int,可去掉类型转换 if ((int)data[dataTypeEnum] < 100) { data[dataTypeEnum] = (int)data[dataTypeEnum] + 1; return true; } return false; }
4. 调用示例
和你期望的写法完全一致:
Data tempData = new Data(22, 40, 3); int numberToAdd = 30; while (numberToAdd > 0) { DataTypeEnum dataToAddTo = (DataTypeEnum)Random.Range(0, 3); if (Increase(tempData, dataToAddTo)) numberToAdd--; }
补充说明
- 如果你的8种数据类型都是同一种(比如都是int),可以把索引器的返回类型从
object改成对应类型(如int),避免类型转换,代码更简洁。 - 你之前尝试的「数组存储+属性访问」方案其实是可行的,大概率是之前的写法有误。正确写法应该是用私有数组存储数据,属性的get/set直接操作数组元素,这样修改属性会同步更新数组,反之亦然:
public class Data { private int[] _data; public int Age { get => _data[0]; set => _data[0] = value; } public int Salary { get => _data[1]; set => _data[1] = value; } public Data(int age, int salary, int booksOwned) { _data = new int[] { age, salary, booksOwned }; } // 同样可以添加索引器 public int this[DataTypeEnum type] { get => _data[(int)type]; set => _data[(int)type] = value; } }
但这种方案只适合所有字段类型相同的场景,如果你有不同类型的字段,还是索引器方案更灵活。
内容的提问来源于stack exchange,提问作者user11344930
相关产品推荐
相关产品推荐

