У меня есть некоторые (не) общие функции явно присвоенных DbSet
(с использованием Entity Framework 6.1, но вопрос более общий характер, в некотором смысле):Достичь общий вызов метода в зависимости от типа данного
//Non-generic type method
public static IQueryable BuildQuery(this DbSet dbSet)
{
return dbSet;
}
//Generic base class elements method
public static IQueryable<Entity> BuildQuery(this DbSet<Entity> dbSet)
{
return dbSet.Include(de1 => de1.NavigationPropertyBase);
}
//Derived class 1 elements method
public static IQueryable<DerivedEntity1> BuildQuery(this DbSet<DerivedEntity1> dbSet)
{
return dbSet.Include(de1 => de1.NavigationPropertyX);
}
//Derived class 2 elements method
public static IQueryable<DerivedEntity2> BuildQuery(this DbSet<DerivedEntity2> dbSet)
{
return dbSet.Include(de2 => de2.NavigationPropertyX).
Include(de2 => de2.NavigationPropertyY);
}
Я знаю, что хотя DerivedEntity1
и DerivedEntity2
продлены Entity
, Dbset<DerivedEntityX>
не распространяется DbSet<Entity>
.
Что я хочу сделать, это достижение позднего связывания как поведение, основанное на родовом типе. Я думал поставить родовой тип в необщий переменный, а затем вызовите метод BuildQuery
(видно, как она существует для необщего типа во время компиляции):
//This compiles with no errors.
DbSet dbSetNonGeneric = dbSet; // dbSet is of DbSet<DerivedEntity1> type
var result = dbSetNonGeneric.BuildQuery();
Моего вопрос, будет ли это приведет к вызову метода BuildQuery
в соответствии с общим типом или вызовет его не общий метод? А во втором случае есть ли способ добиться такого рода вызова метода?
Можете ли вы привести пример использования 'dynamic' и/или использование отражения?Спасибо. –
@NickL. Попробуйте и посмотрите, что произойдет. Если у вас возникли проблемы с изменением типа переменной на «dynamic», то описывайте конкретную проблему, с которой вы сталкиваетесь. – Servy
Ключевое слово 'dynamic' было не очень полезно, так как комбинация с методами расширения на C# проблематична. Ваш ответ мне помог, спасибо вам большое. –