Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在派生的DbContext数据库集上循环,以便可以向DbContext对象添加ClearAll()扩展_C#_Reflection_Dbset_System.type - Fatal编程技术网

C# 在派生的DbContext数据库集上循环,以便可以向DbContext对象添加ClearAll()扩展

C# 在派生的DbContext数据库集上循环,以便可以向DbContext对象添加ClearAll()扩展,c#,reflection,dbset,system.type,C#,Reflection,Dbset,System.type,基于[code>Type.IsGenericType和Type.IsGenericTypeDefinition]之间的差异[1],我获得了我所缺少的信息,以便能够通过反射检索DbContext的数据库集 然而,我现在被困在别的地方。在下面的代码示例中,我确实成功地获得了DbSet泛型实例,但现在我希望能够在编译时将它们转换为特定的泛型类型定义 dbSet是我的DbContext中的一个dbSet的真实实例,但是如何将它转换为它的真实类型定义呢?(以第一次循环迭代为例,dBSet将表示dBSet-

基于[code>Type.IsGenericType和
Type.IsGenericTypeDefinition
]之间的差异[1],我获得了我所缺少的信息,以便能够通过反射检索DbContext的数据库集

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

dbSet是我的DbContext中的一个dbSet的真实实例,但是如何将它转换为它的真实类型定义呢?(以第一次循环迭代为例,dBSet将表示dBSet-如何在编译时对该变量强制执行此类型


更新:我刚刚回顾了我正在尝试做的事情,但…恐怕没有任何意义/这是不可能的。因为只有在运行时才能发现真正的类型,所以在此之前(编译时是在此之前的一个阶段),我无法与真正的泛型类型关联

在任何情况下-我真正感兴趣的是,在编译时,IDE向我显示
IEnumerable
(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; }
}
private static void Main(字符串[]args)
{
MyDb MyDb=新的MyDb();
List dbSetProperties=myDb
.GetType()
.GetProperties()
.Where(pi=>pi.PropertyType.IsGenericType&&string.Equals(pi.PropertyType.GetGenericTypeDefinition().FullName,typeof(DbSet.FullName,StringComparison.OrdinalIgnoreCase)).ToList();
foreach(dbSetProperties中的PropertyInfo dbSetProperty)
{
Type[]typeArguments=dbSetProperty.PropertyType.GetGenericaArguments();
类型dbSetGenericContainer=typeof(DbSet);
类型dbSetGenericType=dbSetGenericContainer.MakeGenericType(类型参数);
对象dbSet=Convert.ChangeType(dbSetProperty.GetValue(myDb),dbSetGenericType);
}
}
公共类MyDb:DbContext
{
公共数据库集A{get;set;}
公共数据库集B{get;set;}
公共无效ClearTables()
{
}
}
公共A类
{
公共字符串aaa{get;set;}
公共列表myList{get;set;}
}
公共B级
{
公共int MyInt{get;set;}
}
DbSet
本身不是一种类型;您的问题实际上没有意义


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

使用
pi.PropertyType.IsGenericType
@UlugbekUmirov:你是对的……我现在想知道另一篇文章中的人是如何得到结果的…@Veverke:谢谢你发现这个错误。在我的回答中,它是同时也被更正了!@DanielHilgarth:哦,太好了,我对那篇文章感到困惑:)我想我应该删除这篇文章?不需要删除它。我可以做DbSet DbSet=Convert.ChangeType(dbSetProperty.GetValue(myDb),dbSetGenericType)作为DbSet;但我真正想要的是一种删除每个DbSet的所有元素的方法,我想在DbContext中添加ClearAll功能。我看不到DbSet为我提供任何可以帮助我的东西。我尝试使DbSet成为可查询的,但我也看不出这对我有什么帮助。我需要像AsEnumerable()@Veverke:
Convert.ChangeType
这样的东西对你来说完全没有用;这与这种情况无关。相反,您可以创建一个通用方法,该方法采用
DbSet
,并使用反射调用正确的
T