如何将对象从反射投射到DbSet <type>

我有一个DbContext实例,该实例的属性是DbSet 。我已经使用反射来获取每个DbSet 的所有实例,但是我不能使用它,原因是我无法将其强制转换为DbSet 。

var types = _dbContext.GetType().GetProperty();
foreach(var type in types){
   var dbSetvalue = type.Getvalue(_dbContext,null);
   var entities = dbSetvalue.ToList(); // error cause of i cant not cast it.
}

因此,在这种情况下,我想将dbSetvalue强制转换为其类型(DbSet ..),问题是DbSet具有泛型,即无法强制转换。可以吗?

Win_ky33 回答:如何将对象从反射投射到DbSet <type>

首先,我建议检查PropertyType是否确实是DBSet。

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

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

您的代码应如下所示:

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();
}
本文链接:https://www.f2er.com/3150654.html

大家都在问