循环派生的DbContext DbSets,以便我可以向DbContext对象添加ClearAll()扩展
本文关键字:DbContext 添加 对象 ClearAll 可以向 扩展 派生 DbSets 循环 我可以 | 更新日期: 2023-09-27 18:05:52
基于[Type.IsGenericType
和Type.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; }
}
DbSet<>
本身不是一个类型;你的问题实际上没有意义。
然而,幸运的是,DbSet<T>
实现了非泛型的DbSet
基类,所以您可以直接使用它。