循环派生的DbContext DbSets,这样我就可以在我的DbContext对象中添加一个ClearAll()扩展

基于[ Type.IsGenericTypeType.IsGenericTypeDefinition ] [1]之间的差异,我获得了我缺少的信息,以便能够通过Reflection检索DbContext的DbSet。

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

dbSet是来自我的DbContext的DbSets 之一的真实实例,但是如何将它转换为真正的类型定义? (进行第一次循环迭代,dBSet将代表DbSet – 如何在编译时对此变量强制执行此类型?


更新 :我刚刚审查了我要做的事情……恐怕没有意义/这是不可能的。 由于真实类型仅在运行时被发现,因此我无法在此之前(并且编译时间是之前的某个阶段)与真实的generics类型相关。

在任何情况下 – 我真正感兴趣的是,在编译时,IDE显示IEnumerable成员(DbSet 实现它)。 所以我真的需要把它转换为DbSet 。 这样的演员怎么样?

可能吗 ?!

 private static void Main(string[] args) { MyDb myDb = new MyDb(); List 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 { get; set; } public DbSet B { get; set; } public void ClearTables() { } } public class A { public string aaa { get; set; } public List myList { get; set; } } public class B { public int MyInt { get; set; } } 

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

但是,幸运的是, DbSet实现了非genericsDbSet基类,因此您可以使用它。