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

如何实现类属性的数组式便捷读写,结合枚举高效管理数据?

问题分析与解决方案

你当前的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:42:56