循环派生的DbContext DbSets,以便我可以向DbContext对象添加ClearAll()扩展

本文关键字:DbContext 添加 对象 ClearAll 可以向 扩展 派生 DbSets 循环 我可以 | 更新日期: 2023-09-27 18:05:52

基于[Type.IsGenericTypeType.IsGenericTypeDefinition之间的差异][1],我获得了我丢失的信息,以便能够通过反射检索DbContext的DbSets。

然而,我现在被困在其他地方。在下面的代码示例中,我确实成功地获得了DbSet泛型实例,但是我现在希望能够在编译时将它们转换为特定的泛型类型定义。

dbSet是DbSets<…>从我的DbContext,但如何将其转换为其真正的类型定义?(以第一次循环迭代为例,dBSet将表示dBSet -如何在编译时对该变量强制这种类型?


更新:我刚刚回顾了我正在尝试做的事情,并且…恐怕这没有意义/不可能。由于真正的类型只在运行时发现,在此之前(编译时间是在此之前的一个阶段),我没有办法与真正的泛型类型相关。

在任何情况下-我真正感兴趣的是有,在编译时,IDE显示我IEnumerable<T>的成员(DbSet<>实现它)。所以我真的需要把它转换成DbSet<>。这样的转换应该是什么样的呢?

这可能吗?!

private static void Main(string[] args)
{
    MyDb myDb = new MyDb();
    List<PropertyInfo> dbSetProperties = myDb
        .GetType()
        .GetProperties()
        .Where(pi => pi.PropertyType.IsGenericType && string.Equals(pi.PropertyType.GetGenericTypeDefinition().FullName, typeof(DbSet<>).FullName, StringComparison.OrdinalIgnoreCase)).ToList();
    foreach (PropertyInfo dbSetProperty in dbSetProperties)
    {
        Type[] typeArguments = dbSetProperty.PropertyType.GetGenericArguments();
        Type dbSetGenericContainer = typeof(DbSet<>);
        Type dbSetGenericType = dbSetGenericContainer.MakeGenericType(typeArguments);
        object dbSet = Convert.ChangeType(dbSetProperty.GetValue(myDb), dbSetGenericType);
    }
}
public class MyDb : DbContext
{
    public DbSet<A> A { get; set; }
    public DbSet<B> B { get; set; }
    public void ClearTables()
    {
    }
}
public class A
{
    public string aaa { get; set; }
    public List<int> myList { get; set; }
}
public class B
{
    public int MyInt { get; set; }
}

循环派生的DbContext DbSets,以便我可以向DbContext对象添加ClearAll()扩展

DbSet<>本身不是一个类型;你的问题实际上没有意义。

然而,幸运的是,DbSet<T>实现了非泛型的DbSet基类,所以您可以直接使用它。