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

泛型IEnumerable类的Get/Set方法实现及自定义对象适配问题

泛型类属性栈溢出与自定义对象适配问题的解决

问题根源

原代码中Data属性的写法存在致命逻辑错误:

  • get方法直接返回this.Data,会无限递归调用自身的getter,最终触发栈溢出
  • set方法中直接执行Data = value,同样会无限递归调用自身的setter,也是栈溢出的诱因
  • 注释set中的赋值语句后,getter的无限递归依然存在,string类型实例看似正常属于偶然的运行时优化,但自定义对象类型会因持续递归调用引发内存访问异常("Unable to read memory")

解决方案

必须为属性定义私有后备字段(backing field),用于实际存储数据,属性的get/set操作均针对该字段而非属性自身。同时可在setter中嵌入自定义逻辑(如数据验证、状态通知等)。

完整实现代码

public class MyEnumClass<T> : IEnumerable<MyEnumClass<T>>
{
    // 私有后备字段,负责实际存储Data的值
    private T _data;

    public T Data
    {
        get { return _data; } 
        set 
        {
            // 示例自定义逻辑:仅当值发生变化时执行赋值与后续操作
            if (!EqualityComparer<T>.Default.Equals(_data, value))
            {
                _data = value;
                // 这里可添加你的自定义逻辑,比如日志记录、事件通知等
                OnDataUpdated();
            }
        }
    }

    public MyEnumClass(T data)
    {
        Data = data;
    }

    // 自定义逻辑示例:属性值更新时的处理方法
    private void OnDataUpdated()
    {
        Console.WriteLine("Data属性已完成更新");
    }

    // 实现IEnumerable接口的必要方法(原代码未实现,需补充)
    public IEnumerator<MyEnumClass<T>> GetEnumerator()
    {
        // 根据业务需求实现枚举逻辑,示例返回自身的枚举
        yield return this;
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

// 自定义对象示例
public class MyOwnObjectType
{
    public string Name { get; set; }
    public int Age { get; set; }
}

测试代码

// string类型实例化
var stringInstance = new MyEnumClass<string>("Foo");
Console.WriteLine(stringInstance.Data); // 输出: Foo

// 自定义对象类型实例化
var customObj = new MyOwnObjectType { Name = "Test", Age = 25 };
var customInstance = new MyEnumClass<MyOwnObjectType>(customObj);
Console.WriteLine(customInstance.Data.Name); // 输出: Test

// 修改Data属性,触发自定义逻辑
customInstance.Data = new MyOwnObjectType { Name = "NewTest", Age = 30 };

内容的提问来源于stack exchange,提问作者user10149299

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 06:55:55