EF6技术问题:如何为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
相关产品推荐
相关产品推荐

