C# 如何将反射得到的对象投射到DbSet<;类型>;

C# 如何将反射得到的对象投射到DbSet<;类型>;,c#,entity-framework,reflection,C#,Entity Framework,Reflection,我有一个DbContext实例,它的属性是DbSet。我已经使用反射来获取每个DbSet的所有实例,但是我不能使用它,因为我不能将它投射到DbSet中 var types=\u dbContext.GetType().GetProperty(); foreach(类型中的变量类型){ var dbSetValue=type.GetValue(_dbContext,null); var entities=dbSetValue.ToList();//错误原因是我无法强制转换它。 } 因此在本例中,

我有一个DbContext实例,它的属性是DbSet。我已经使用反射来获取每个DbSet的所有实例,但是我不能使用它,因为我不能将它投射到DbSet中

var types=\u dbContext.GetType().GetProperty();
foreach(类型中的变量类型){
var dbSetValue=type.GetValue(_dbContext,null);
var entities=dbSetValue.ToList();//错误原因是我无法强制转换它。
}

因此在本例中,我想将
dbSetValue
强制转换为它的类型(DbSet..),问题是DbSet具有泛型,即不能强制转换。可能吗?

首先,我建议检查PropertyType是否真的是一个DBSet

请注意,
type.GetValue(_dbContext)
返回一个对象,但在反射过程中应将该类型作为
动态
处理

由于需要动态支持
IEnumerable
方法,因此需要使用
IEnumerable

您的代码应该如下所示:

var types = _dbContext.GetType().GetProperties();

// Check if property is really a DbSet<TEntity>
var filteredTypes = types.Where(x => x.PropertyType.IsGenericType 
                                  && x.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>));

foreach (var type in filteredTypes)
{
     var dbSet = (IEnumerable<dynamic>) type.GetValue(_dbContext);    
     var entities = dbSet.ToList();
}
var types=\u dbContext.GetType().GetProperties();
//检查属性是否真的是DbSet
var filteredTypes=types.Where(x=>x.PropertyType.IsGenericType
&&x.PropertyType.GetGenericTypeDefinition()==typeof(DbSet));
foreach(filteredTypes中的变量类型)
{
var dbSet=(IEnumerable)type.GetValue(_dbContext);
var entities=dbSet.ToList();
}

实体应该是什么样的数据类型?
实体应该是一个实体列表,就像列表一样。你不能创建一个
列表。实体的类型需要在编译时知道。那么,我可以通过反射获取该实体的列表吗?您是否尝试将dbSetValue设置为动态?在这种情况下,var将类型替换为object,但如果强制使用动态变量,它应该可以工作