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

EF6技术问题:如何为Page实体填充共享StaticButtons列表

解决Page实体StaticButtons共享列表的填充问题

首先要明确:当前Page类中的StaticButtons是实例属性,每个Page实例都会拥有独立的列表,这不符合“所有Page共享”的设计要求。第一步需要将StaticButtons修改为静态成员,才能实现跨实例共享。

修正后的实体定义

Page类(调整StaticButtons为静态)

public class Page
{
    public Page()
    {
        Command_Type = Command_Type.Navigation;
    }

    public int ID { get; set; }
    public Command_Type Command_Type { get; set; }

    // 实例专属按钮列表
    public IList<Button> Buttons { get; } = new List<Button>();
    // 所有Page共享的静态按钮列表(改为静态属性)
    public static IList<Button> StaticButtons { get; } = new List<Button>();
}

Button类(补充定义)

public class Button
{
    public bool IsStatic { get; set; } = false;
    // 可选:添加唯一标识用于可靠去重
    public int Id { get; set; }
}

填充StaticButtons的几种常见场景

场景1:从全局Button集合中筛选添加

如果你有一个存储所有Button实例的全局集合,直接筛选IsStatic=true的按钮添加到共享列表(注意去重):

// 示例全局Button集合
var allButtons = new List<Button>
{
    new Button { Id = 1, IsStatic = true },
    new Button { Id = 2, IsStatic = false },
    new Button { Id = 3, IsStatic = true }
};

// 筛选并去重添加
foreach (var staticBtn in allButtons.Where(b => b.IsStatic))
{
    // 用Id判断是否已存在,比引用比较更可靠
    if (!Page.StaticButtons.Any(b => b.Id == staticBtn.Id))
    {
        Page.StaticButtons.Add(staticBtn);
    }
}

场景2:添加Button到Page时自动同步

可以给Page封装按钮添加方法,在添加按钮时自动判断是否需要加入共享列表:

public class Page
{
    // ... 其他成员

    // 将Buttons改为只读对外暴露,内部用私有列表控制添加
    private readonly List<Button> _buttons = new List<Button>();
    public IReadOnlyList<Button> Buttons => _buttons.AsReadOnly();

    public void AddButton(Button button)
    {
        _buttons.Add(button);
        
        // 如果是静态按钮,同步到共享列表(去重)
        if (button.IsStatic && !Page.StaticButtons.Any(b => b.Id == button.Id))
        {
            Page.StaticButtons.Add(button);
        }
    }
}

// 使用示例
var page = new Page();
var staticBtn = new Button { Id = 4, IsStatic = true };
page.AddButton(staticBtn);
// 此时Page.StaticButtons已包含该静态按钮

场景3:从所有Page实例的Buttons中收集

如果你需要从已创建的所有Page实例里提取静态按钮:

// 示例所有Page实例集合
var allPages = new List<Page> { page1, page2, page3 };

foreach (var page in allPages)
{
    foreach (var staticBtn in page.Buttons.Where(b => b.IsStatic))
    {
        if (!Page.StaticButtons.Any(b => b.Id == staticBtn.Id))
        {
            Page.StaticButtons.Add(staticBtn);
        }
    }
}

关键注意事项

  • 必须将StaticButtons设为静态成员,否则无法实现跨Page实例的共享。
  • 务必添加去重逻辑,避免同一个静态按钮被重复加入共享列表(优先用唯一标识判断,而非引用比较)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:50:06