문제

에서 영감을 MVC storefront 최신 프로젝트에서 일하고 있어요 사용하고 확장에서 방법을 진행하고 결과를 필터링합니다.

이 인터페이스;

IPrimaryKey
{
  int ID { get; }
}

고 내가 이 연장 방법

public static IPrimaryKey GetByID(this IQueryable<IPrimaryKey> source, int id)
{
    return source(obj => obj.ID == id);
}

가 하나의 클래스,SimpleObj 를 구현하는 IPrimaryKey.있을 때 진행하고 있습니다.의 SimpleObj 의 GetByID 방법이 없지 않는 한 나는 explicitally 캐스팅으로 진행하고 있습니다.의 IPrimaryKey 것보다 적은 이상적입니다.

나는 뭔가요?

도움이 되었습니까?

해결책

그것은 작품을 할 때,바로 이루어집니다.cfeduke 의 솔루션을 작동합니다.그러나,당신은 없을 만들기 IPrimaryKey 인터페이스는 일반적인 사실,당신을 변경할 필요가 없는 너의 원래의 정의에서 모:

public static IPrimaryKey GetByID<T>(this IQueryable<T> source, int id) where T : IPrimaryKey
{
    return source(obj => obj.ID == id);
}

다른 팁

편집: 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);

이 작업할 수 없는 사실로 인해 제네릭이 없는 능력에 따라 상속 패턴이 있습니다.ie.진행<SimpleObj> 지 않는 상속에 나무의 진행<IPrimaryKey>

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top