获取继承接口<Type:Type>的类

Getting classes that Inherits interface<Type:Type>

这是我的问题,我想将所有流畅的 api 配置 类 作为列表获取。 然后将它们应用到我的 DbContext 中。 我的域 类 都像这样继承 BaseModel ;

public class Role : BaseModel
{
    public string RoleTitle { get; set; }

    public string RoleDescription { get; set; }

    public ICollection<UserRole> UserRoles { get; set; }
}

配置如下:

public class RoleConfig : IEntityTypeConfiguration<Role>
{
  public void Configure(EntityTypeBuilder<Role> builder)
  {
      builder.Property(r => r.RoleTitle)
          .IsRequired()
          .HasMaxLength(100);

      builder.Property(r => r.RoleDescription)
        .HasMaxLength(250);
  }
}

我已经在我的 DbContext 中使用的是:

    modelBuilder.ApplyConfiguration(new UserConfig());
    modelBuilder.ApplyConfiguration(new RoleConfig());
    modelBuilder.ApplyConfiguration(new UserRoleConfig());
    and more .....

而我正在寻找的是:

    foreach (var config in ConfigClasses)
    {
        modelBuilder.ApplyConfiguration(config);
    }

所以问题是我如何获得所有配置 类?我试过了但没有用:

        var type = typeof(IEntityTypeConfiguration<Anytype : BaseModel>);
        var ConfigClasses= AppDomain.CurrentDomain.GetAssemblies()
            .SelectMany(s => s.GetTypes())
            .Where(p => type.IsAssignableFrom(p)).ToList();

问题是 IEntityTypeConfiguration<Anytype : BaseModel> 任何 idia 我该怎么做?以这种方式或任何其他方式?

ModelBuilder上有一个添加所有配置的方法,你可以使用它:

modelBuilder.ApplyConfigurationsFromAssembly(typeof(YourDbContext).Assembly);

如您所知,YourDbContext 和配置必须在同一个程序集中。

下面是一个关于如何通过反射查找通用接口的例子:

var appDomain = AppDomain.CurrentDomain;
var assemblies = appDomain.GetAssemblies();

foreach (var assembly in assemblies)
{
    var types = assembly.GetTypes();

    foreach (var type in types)
    {
        var interfaces = type.GetInterfaces();

        foreach (var iface in interfaces)
        {
            if (iface.IsGenericType)
            {
                var genericInterface = iface.GetGenericTypeDefinition();

                if(genericInterface == typeof(MyGenericInterface<>))
                {
                    Console.WriteLine($"Type {type.Name} implements {genericInterface.Name}");
                }
            }
        }
    }
}

有了这个草图,您应该能够找到所有需要的类型,通过 Activator.CreateInstance() 初始化它们并将这些实例应用到您的模型构建器。