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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:39:03