Дополнительные Методы, не работающие на интерфейс

6
задан Kirschstein 17 September 2008 в 12:14
поделиться

3 ответа

Это работает, когда сделано правильно. работы решения cfeduke. Однако Вы не должны делать IPrimaryKey интерфейсный дженерик, на самом деле, Вы не должны изменять свое исходное определение вообще:

public static IPrimaryKey GetByID<T>(this IQueryable<T> source, int id) where T : IPrimaryKey
{
    return source(obj => obj.ID == id);
}
13
ответ дан 8 December 2019 в 12:24
поделиться

Это не может работать вследствие того, что дженерики не имеют способности следовать за шаблонами наследования. т.е. IQueryable <SimpleObj> не находится в дереве наследования IQueryable <IPrimaryKey>

2
ответ дан 8 December 2019 в 12:24
поделиться

Править: Решение 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);
4
ответ дан 8 December 2019 в 12:24
поделиться