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); } }
关键逻辑说明
- 全量实现类查找:保留了原有筛选规则(非抽象、密封类、私有嵌套、存在无参构造函数),同时用
IsAssignableFrom简化了接口实现判断逻辑,删除了原代码中匹配到首个实现就终止的return语句,确保所有符合条件的类都被加载。 - 顺序执行逻辑:枚举类型默认排序规则基于其底层绑定的整数数值,你定义的
ExecutionGroups已经按执行优先级设置了从小到大的int值,直接通过OrderBy指定按ExecutionGroup排序即可实现G1→G2→G3→G4→G5的执行顺序。
内容的提问来源于stack exchange,提问作者Rowan Smith
相关产品推荐
相关产品推荐

