如何在C#中遍历类名列表批量获取数据库待变更条目
批量处理数据库待变更条目实现方案
问题背景
我正在开发一个基于模板的C#应用程序,该程序通过database.SaveChanged()方法将条目保存到数据库中。我希望查看所有待变更的条目,可通过以下泛型方法实现:
IList<T> GetChanged<T>() where T : class;
目前我可以通过以下方式逐个处理不同类的待变更条目:
foreach (var t in database.GetChanged<Alarm>()) { log.Debug($"DB Change=[{t}]"); } foreach (var t in database.GetChanged<Area>()) { log.Debug($"DB Change. ClassName=[{t.GetType()}], Change=[{t}]"); } ...
但我有多达53个类(Alarm和Area仅为其中两个),希望采用更简便的方式,例如通过遍历类名列表批量处理:
List<ClassNames> Class_List= {Alarm, Area, ..., Server.Domain.ClassName, ...}; // 支持命名空间 foreach (var entry in Class_List) { foreach (var t in database.GetChanged<entry>()) { log.Debug($"DB Change. ClassName=[{entry}], Change=[{t}]"); } }
请问如何实现这种遍历类名列表批量获取待变更条目的操作?
实现方案
由于C#泛型类型参数需在编译时确定,直接用变量作为类型参数无法通过编译,需通过反射动态调用泛型方法,具体步骤如下:
1. 构建目标类型列表
先收集所有需要处理的类的Type对象,支持带命名空间的类型:
var targetTypes = new List<Type> { typeof(Alarm), typeof(Area), typeof(Server.Domain.ClassName), // 补充其他51个类的typeof(...)声明 };
2. 反射调用泛型方法
通过反射获取GetChanged方法的泛型定义,再针对每个类型生成并调用对应的泛型方法:
// 获取GetChanged方法的泛型定义(若方法属于接口,建议用接口类型获取以避免重载冲突) var getChangedMethodDef = database.GetType().GetMethod("GetChanged", Type.EmptyTypes); foreach (var type in targetTypes) { // 生成对应类型的泛型方法实例 var genericMethod = getChangedMethodDef.MakeGenericMethod(type); // 调用方法并转换为IList类型 var changedItems = (IList)genericMethod.Invoke(database, null); // 遍历处理每个变更条目 foreach (var item in changedItems) { log.Debug($"DB Change. ClassName=[{type.Name}], Change=[{item}]"); } }
3. 优化建议
- 避免重载冲突:如果
database类有多个GetChanged重载方法,建议通过接口类型(如typeof(IDbOperations))获取方法定义,确保拿到正确的泛型方法。 - 配置化管理类型:可以将类型全名存入配置文件(如JSON、XML),通过
Type.GetType("类型全名")动态加载类型,避免硬编码53个类型,便于后续维护。
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

