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

C# 反射查找接口实现类并按枚举排序调用方法的问题

实现方案

原有代码存在两个需要修正的问题:

  • 匹配到第一个IDatabaseSqlCommands实现类后直接执行return,无法加载所有符合条件的实现
  • 缺少对实现类按ExecutionGroup枚举值排序的逻辑

修复后的完整代码

public async Task EnsureSqlCreatedAsync()
{
    // 第一步:筛选所有符合规则的实现类
    var sqlCommandTypes = Assembly.GetExecutingAssembly()
        .DefinedTypes
        .Where(t => 
            !t.IsAbstract && 
            t.IsClass && 
            t.IsSealed && 
            t.IsNestedPrivate && 
            t.GetConstructor(Type.EmptyTypes) != null && // 提前过滤无空构造函数的类
            typeof(IDatabaseSqlCommands).IsAssignableFrom(t) // 直接判断是否实现目标接口,无需遍历接口集合
        )
        .ToList();

    // 第二步:创建实例并按ExecutionGroup排序
    var sortedInstances = sqlCommandTypes
        .Select(t => (IDatabaseSqlCommands)Activator.CreateInstance(t))
        .OrderBy(cmd => cmd.ExecutionGroup) // 枚举默认按底层int值排序,正好匹配G1到G5的执行顺序
        .ToList();

    // 第三步:按顺序执行Configure方法
    foreach (var cmd in sortedInstances)
    {
        await cmd.Configure(this);
    }
}

关键逻辑说明

  1. 全量实现类查找:保留了原有筛选规则(非抽象、密封类、私有嵌套、存在无参构造函数),同时用IsAssignableFrom简化了接口实现判断逻辑,删除了原代码中匹配到首个实现就终止的return语句,确保所有符合条件的类都被加载。
  2. 顺序执行逻辑:枚举类型默认排序规则基于其底层绑定的整数数值,你定义的ExecutionGroups已经按执行优先级设置了从小到大的int值,直接通过OrderBy指定按ExecutionGroup排序即可实现G1→G2→G3→G4→G5的执行顺序。

内容的提问来源于stack exchange,提问作者Rowan Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:09:03