如何用统一类型简化DbSet的WinForms重复数据绑定代码?
实现统一处理不同DbSet的重构方案
完全可行,核心是不要用object类型,而是利用非泛型DbSet类型或者动态类型来统一操作,以下是两种具体实现方式:
方法一:使用非泛型DbSet(推荐,保留编译时检查)
Entity Framework(包括EF Core)提供了非泛型的DbSet类型,你可以通过实体类型获取对应的非泛型DbSet,从而统一调用Load和绑定数据:
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { // 根据选中项匹配对应的实体类型 Type entityType = comboBox1.SelectedItem.ToString() switch { "Animals" => typeof(Animals), "Birds" => typeof(Birds), "Fishes" => typeof(Fishes), _ => null }; if (entityType == null) return; // 获取非泛型DbSet实例 DbSet dbSet = myDb.Set(entityType); // 执行加载操作 dbSet.Load(); // 绑定到DataGridView,转成BindingList保证数据联动 dataGridView1.DataSource = dbSet.Local.ToBindingList(); }
方法二:使用动态类型(快速实现,但无编译时检查)
如果不想处理类型转换,也可以用dynamic类型让运行时识别DbSet的方法,缺点是编译阶段无法检查错误:
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { dynamic dbSet = comboBox1.SelectedItem.ToString() switch { "Animals" => myDb.Animals, "Birds" => myDb.Birds, "Fishes" => myDb.Fishes, _ => null }; if (dbSet == null) return; dbSet.Load(); dataGridView1.DataSource = dbSet.Local.ToBindingList(); }
为什么用object不行?
object是所有类型的基类,但编译器无法推断它实际是DbSet<T>类型,因此不能直接调用Load、Local等DbSet专属方法。而上面两种方式要么通过非泛型DbSet明确类型,要么让动态类型在运行时解析方法,解决了这个问题。
内容的提问来源于stack exchange,提问作者Dimkqo
相关产品推荐
相关产品推荐

