C#实现存储不同表单控件的泛型对象泛型列表求助
手把手教你实现泛型表单控件列表
别慌,泛型列表其实没你想的那么复杂,咱们从基础逻辑一步步梳理,帮你把混乱的代码捋清楚。
首先,假设你已经有了基础的UIObject基类,所有表单控件对象(比如文本框、按钮)都继承这个基类。先把这个结构明确下来:
// 基础UIObject基类,所有表单控件共享的属性/方法都放这 public class UIObject { public string ControlId { get; set; } public bool IsEnabled { get; set; } // 其他通用属性,比如位置、大小等 } // 文本框控件类(继承UIObject) public class TextBoxControl : UIObject { public string InputText { get; set; } public int MaxInputLength { get; set; } } // 按钮控件类(继承UIObject) public class ButtonControl : UIObject { public string ButtonText { get; set; } public void TriggerClick() { // 按钮点击逻辑 } }
接下来是核心的UIObjectList泛型类——其实不用自己从零实现列表的底层存储(这很容易搞乱),直接复用.NET内置的List<T>就行,咱们只需要封装符合业务需求的逻辑:
// 泛型列表类,约束T必须是UIObject或其子类,保证类型安全 public class UIObjectList<T> where T : UIObject { // 内部用.NET原生List<T>存数据,省掉自己实现增删改查的麻烦 private readonly List<T> _controlList = new List<T>(); // 添加控件到列表 public void AddControl(T control) { if (control != null && !string.IsNullOrEmpty(control.ControlId)) { // 可以加个重复ID判断,避免重复添加 if (!_controlList.Any(c => c.ControlId == control.ControlId)) { _controlList.Add(control); } } } // 根据ID查找控件 public T GetControlById(string controlId) { return _controlList.FirstOrDefault(c => c.ControlId.Equals(controlId, StringComparison.OrdinalIgnoreCase)); } // 获取所有控件(返回只读集合,避免外部直接修改内部列表) public IReadOnlyList<T> GetAllControls() { return _controlList.AsReadOnly(); } // 移除指定控件 public bool RemoveControl(T control) { return _controlList.Remove(control); } // 获取列表长度 public int ControlCount => _controlList.Count; }
现在看看怎么用这个类,非常简单:
// 1. 创建只存文本框的列表 var textBoxList = new UIObjectList<TextBoxControl>(); textBoxList.AddControl(new TextBoxControl { ControlId = "usernameInput", InputText = "admin", MaxInputLength = 20 }); // 2. 创建混合存储所有表单控件的列表 var allControlsList = new UIObjectList<UIObject>(); allControlsList.AddControl(new TextBoxControl { ControlId = "passwordInput", InputText = "123456" }); allControlsList.AddControl(new ButtonControl { ControlId = "submitBtn", ButtonText = "提交" }); // 3. 遍历列表,按需处理不同类型的控件 foreach (var control in allControlsList.GetAllControls()) { Console.WriteLine($"控件ID:{control.ControlId},类型:{control.GetType().Name}"); // 用类型转换访问子类专属属性/方法 if (control is TextBoxControl textBox) { Console.WriteLine($"文本框内容:{textBox.InputText}"); } else if (control is ButtonControl button) { Console.WriteLine($"按钮文本:{button.ButtonText}"); // button.TriggerClick(); // 调用按钮方法 } }
关键要点提醒
- 泛型约束
where T : UIObject:这个约束能确保你的列表里只能放UIObject及其子类,避免存入无关类型,保证了类型安全。 - 复用原生
List<T>:不用自己手动实现数组扩容、索引管理这些底层逻辑,既减少代码混乱,又能利用.NET内置的高效实现。 - 如果不需要自定义逻辑:其实直接用
List<UIObject>或者List<TextBoxControl>就够了,只有当你需要统一的业务规则(比如重复ID校验、统一序列化)时,才需要封装UIObjectList类。
内容的提问来源于stack exchange,提问作者user9432753
相关产品推荐
相关产品推荐

