C# Reflection:遍历程序集查找DomainEvent子类并验证对应泛型工厂是否存在
实现方案
核心问题说明
你现有代码中GetAuditTrailFactory<T>()的泛型参数T需要在编译期确定,但遍历拿到的type是运行时的类型对象,无法直接作为泛型参数传入,需要通过反射构造对应封闭泛型方法再调用。
完整实现代码
// 先获取GetAuditTrailFactory的开放泛型方法定义 var openMethod = typeof(AuditTrailFactoryProvider).GetMethod("GetAuditTrailFactory", BindingFlags.Public | BindingFlags.Static); if (openMethod == null) { throw new InvalidOperationException("未找到GetAuditTrailFactory方法"); } // 遍历所有非抽象的DomainEvent子类 foreach (var eventType in typeof(DomainEvent).Assembly.GetTypes() .Where(x => !x.IsAbstract && x.IsSubclassOf(typeof(DomainEvent)))) { // 构造对应当前事件类型的封闭泛型方法 var closedMethod = openMethod.MakeGenericMethod(eventType); // 调用方法获取工厂实例 var factoryInstance = closedMethod.Invoke(null, null); // 断言不为空,可自定义错误提示方便排查 Assert.NotNull(factoryInstance, $"未找到{eventType.Name}对应的AuditTrailFactory实现"); }
注意事项
- 如果
GetAuditTrailFactory存在重载,需要在GetMethod时补充参数类型数组来精准匹配目标方法 - 如果该方法是实例方法而非静态方法,
Invoke的第一个参数需要传入AuditTrailFactoryProvider的实例,不能填null - 如果你的DomainEvent子类分布在多个程序集,需要调整获取程序集的逻辑,把所有包含事件类的程序集都纳入遍历范围
内容的提问来源于stack exchange,提问作者yBother
相关产品推荐
相关产品推荐

