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

时间:2019-11-06 16:05:30

标签: c# entity-framework reflection

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

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具有泛型,即无法强制转换。可以吗?

1 个答案:

答案 0 :(得分:1)

首先,我建议检查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();
}