基于[Type.IsGenericType
和Type.IsGenericTypeDefinition
] [1]之间的差异,我获得了我所缺少的信息,以便能够通过反射检索DbContext的DbSets 。
然而,我现在被困在其他地方。在下面的代码示例中,我确实成功获取了DbSet泛型实例,但我现在希望能够在编译时将它们转换为特定的泛型类型定义。
dbSet是其中一个DbSets< ...>的真实实例。从我的DbContext,但如何将其转换为真正的类型定义? (进行第一次循环迭代,dBSet将代表DbSet - 如何在编译时对此变量强制执行此类型?
更新:我刚刚审核了我要做的事情......恐怕没有意义/这是不可能的。由于真实类型只是在运行时才被发现,所以在此之前我没有办法(并且编译时间是之前的一个阶段)与真正的泛型类型相关。
在任何情况下 - 我真正感兴趣的是在编译时IDE显示IEnumerable<T>
的成员(DbSet&lt;&gt;实现它)。所以我真的需要把它投到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; }
}
答案 0 :(得分:1)
DbSet<>
本身不是一种类型;你的问题实际上没有意义。
但是,幸运的是,DbSet<T>
实现了非通用DbSet
基类,因此您可以使用它。