Как привести объект из отражения в DbSet <type> - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть экземпляр 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 Ответ

1 голос
/ 08 ноября 2019

сначала я бы предложил проверить 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...