Это работает, когда сделано правильно. работы решения cfeduke. Однако Вы не должны делать IPrimaryKey
интерфейсный дженерик, на самом деле, Вы не должны изменять свое исходное определение вообще:
public static IPrimaryKey GetByID<T>(this IQueryable<T> source, int id) where T : IPrimaryKey
{
return source(obj => obj.ID == id);
}
Это не может работать вследствие того, что дженерики не имеют способности следовать за шаблонами наследования. т.е. IQueryable <SimpleObj> не находится в дереве наследования IQueryable <IPrimaryKey>
Править: Решение Konrad лучше потому что его намного более простое. Ниже работ решения, но только требуется в ситуациях, подобных ObjectDataSource, где метод класса получен посредством отражения, не идя по иерархии наследования. Очевидно, этого не происходит здесь.
Это возможно, я должен был реализовать подобный шаблон, когда я разработал пользовательское решение для платформы объекта для работы с ObjectDataSource:
public interface IPrimaryKey<T> where T : IPrimaryKey<T>
{
int Id { get; }
}
public static class IPrimaryKeyTExtension
{
public static IPrimaryKey<T> GetById<T>(this IQueryable<T> source, int id) where T : IPrimaryKey<T>
{
return source.Where(pk => pk.Id == id).SingleOrDefault();
}
}
public class Person : IPrimaryKey<Person>
{
public int Id { get; set; }
}
Отрывок использования:
var people = new List<Person>
{
new Person { Id = 1 },
new Person { Id = 2 },
new Person { Id = 3 }
};
var personOne = people.AsQueryable().GetById(1);