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

时间:2015-08-02 11:51:13

标签: c# reflection dbset system.type

基于[Type.IsGenericTypeType.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; }
}

1 个答案:

答案 0 :(得分:1)

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

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