2009-05-07 6 views
0

Rob Connery의 상점 전면 비디오 시리즈와 기술을 적용하여이 mvc 프로젝트를 진행하고 있습니다. s는없는 그러나일반적인 확장 방법

public static T WithID<T>(this IQueryable<T>qry,int ID) 
{ 
    return qry.SingleOrDefault(s=>ID==ID); 
} 

:

public static Sponsor WithID(this IQueryable<Sponsor>qry, int ID) 
{ 
    return qry.SingleOrDefault(s => s.ID== ID); 
} 

public static Keyword WithID(this IQueryable<Keyword>qry,int ID) 
{ 
    return qry.SingleOrDefault(s => s.ID== ID); 
} 
.... 

은이 같은 일반적인 확장을 작성하려고,이 문제를 방지하려면 : 필터링 및 확장 방법에 , 나는 같은 나 자신에게 많은 반복 시작 ID, 그럼 어떻게 해결할 수 있니?

답변

5

ID 속성을 선언하는 인터페이스가 필요합니다 (예 :

물론
public static T WithID<T>(this IQueryable<T> source, int id) 
    where T : IInt32Identifiable 
{ 
    return source.SingleOrDefault(s=> s.ID == id); 
} 

, 모든 적절한 클래스가 인터페이스를 구현하게 할 것이다 - 그러나 그것은 일반적으로 쉽게;

public interface IInt32Identifiable 
{ 
    public int ID { get; } 
} 

은 그럼 당신은 쓸 수 있습니다 클래스가 디자이너에서 생성 된 경우 부분 클래스를 사용하려고합니다.

0

두 가지 다른 확장 방법이 필요합니다. 하나는 ID가있는 유형이고 다른 하나는 ID가없는 유형입니다. 또한 모든 ID 유형이 구현하는 인터페이스 또는 추상 기본 클래스가 필요합니다. 그렇지 않으면 컴파일러에서 ID를 역 참조 할 수 없게됩니다.

내가 생각할 수있는 유일한 대안은 ID 속성의 유형을 쿼리하는 데 리플렉션이 필요하며 존재하는 경우 값을 가져옵니다.