You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 14:12:58