2016-05-27 3 views
2

(я использую Ef6 здесь) Скажем, у меня есть абстрактный класс:Как перебрать все DbSet в родовом?

public abstract class MyContext<T> : DbContext 

и давайте его использовать:

public class MyTestContext : MyContext<MyTestContext> 
{ 
    public DbSet<Object1> Object1 { get; set; } 
    public DbSet<Object2> Object2 { get; set; } 
} 

Теперь, скажем, я хочу, чтобы перебрать все DbSets в MyTestContext, в моем абстрактном классе. Кажется, что это будет работать (это в методе в моем абстрактном классе):

var dbSetProperties = typeof(T).GetProperties().Where(p => p.PropertyType == typeof(DbSet<>)); 

Но я получаю «Перечисление не дало никаких результатов».

Что я здесь делаю неправильно? Благодаря!

Редактировать Примечание. Я не ожидаю знать аргументы общего типа до начала - я действительно ищу, чтобы определить, какие типы находятся в каждом из DbSets.

+1

Свойства не относятся к типу DbSet <>, их общее определение есть. –

ответ

4

А Foo<T> не относится к типу Foo<>. Вам нужно получить общее определение типа вашего Foo<T> s и сравнить его.

var dbSetProperties = typeof(MyTestContext) 
    .GetProperties() 
    .Where(p => p.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>)); 
+0

Ха, кажется настолько очевидным в ретроспективе. Спасибо, что сделал. Я дам вам ответ в ... ах .. 6 минут :) – John

Смежные вопросы