如何将C#数据加载代码改为带实体类型参数的通用函数?
解决C#通用数据加载函数的实体类型参数问题
可以通过泛型方法实现实体类型的参数化,彻底摆脱硬编码实体类的限制,让函数适配任意数据表对应的实体类型。以下是完整实现方案:
通用加载函数代码
public void gvLoad<T>(string tableName, string primaryKeyColumn, DataGridView gridView, TextBox txtbx, string countColumn) where T : class { // 拼接SQL查询语句 string sql = $"SELECT * FROM {tableName} ORDER BY {primaryKeyColumn} DESC"; // 获取JSON结果并反序列化为泛型列表 string jsonResult = GetJsonFromSql(sql); List<T> dataList = JsonSerializer.Deserialize<List<T>>(jsonResult); // 绑定数据到DataGridView gridView.DataSource = dataList; // 统计指定列的有效数据并显示 if (!string.IsNullOrEmpty(countColumn) && dataList.Any()) { // 通过反射获取实体类对应列的属性 PropertyInfo targetProp = typeof(T).GetProperty(countColumn); if (targetProp != null) { int validDataCount = dataList.Count(item => { object propValue = targetProp.GetValue(item); return propValue != null && !string.IsNullOrWhiteSpace(propValue.ToString()); }); txtbx.Text = $"有效数据:{validDataCount}/{dataList.Count}"; } } }
核心要点说明
- 泛型参数
:把实体类型作为泛型参数传入,调用时指定具体实体类即可,无需修改函数内部逻辑。 - 通用反序列化:用
JsonSerializer.Deserialize<List<T>>替代硬编码的实体类型,确保JSON能正确转换为对应泛型集合。 - 反射实现列统计:通过
typeof(T).GetProperty(countColumn)动态获取实体类的属性,遍历列表统计非空/非空白的有效数据,实现列名的参数化。
调用示例
// 加载ClientsTbl数据,统计Email列有效数据 gvLoad<db.Tables.ClientsTbl>("ClientsTbl", "ClientID", dataGridView1, txtEmailCount, "Email"); // 加载OrdersTbl数据,统计OrderDate列有效数据 gvLoad<db.Tables.OrdersTbl>("OrdersTbl", "OrderID", dataGridView2, txtOrderDateCount, "OrderDate");
内容的提问来源于stack exchange,提问作者Mo Arafeh
相关产品推荐
相关产品推荐

