2012-04-17 3 views
0

리턴 유형이있는 메소드를 확장하려고합니다.리턴 유형이있는 메소드 확장하기

IQueryable<int> categories = GetCategoryIds(); 

을 그리고 나는 현재하고 있어요 : 예를 들어 다음과 같이

IQueryable<int> GetCategoryIds() 

그래서, 나는 이것을 사용할 수 있습니다

IQueryable<int> categories = GetCategoryIds().Select(c => new Client() { ClientId == c.clientId }); 

이 작동,하지만 난 싶지 않아 그 Select 성명을하십시오. 차라리 type을 제외한 확장 메서드를 사용하여 확장 메서드에서 Reflection을 사용하여 형식 등을 결정하고 결과를 반환 할 수 있습니다. 이게 가능

IQueryable<int> categories = GetCategoryIds().LovelyExtension<int>(1); 

:

public static IQueryable<T> LovelyExtension(this T objectType, int clientId) 

가 그럼 난 (희망) 등이 확장을 사용할 수 있습니다 확장 방법은 무엇인가 같은 것? 시도했을 때, GetCategoryIds 리턴 유형이 확장 메소드와 같지 않았기 때문에 오류가 발생했습니다. 그러나 이것은 Select 문과 함께 작동합니다.

+3

당신의 선택 버전은 이해가되지 않습니다 - 그것은'IEnumerable을 '이 아닌'목록 ', 그래서 categories''로 할당 컴파일 실패 ... –

답변

2

Type에 내선 번호를 쓸 필요가 없습니다. IQueryable<T>에 내선 번호가 필요합니다. 다음과 같이 할 수 있습니다 :

public static IQueryable<T> LovelyExtension<T>(this IQueryable<T> input, int clientId) { 
    Type inputType = typeof(T); 
    // Here you can use reflection if you need to: inputType corresponds to the type of T 
    // Create an instance of IQueryable<T>, and return it to the caller. 
} 
+0

I를 반환해야 내가 코드의 확장 부분을 혼란스럽게 생각한다고 생각해. –

0

변경에서 서명,

public static IQueryable<T> LovelyExtension(this T objectType, int clientId) 

public static T LovelyExtension(this T objectType, int clientId) 

또는

public static IQueryable<T> LovelyExtension(this IQuerable<T> objectType, int clientId) 

GetCategoryIds (

으로는), 수익을 당신의 LovelyExtension의 objectType의에 통과하는 것 인 IQuerable를 (반환 원래 서명을 기반으로하는 유형이 IQuerable이됩니다> 분명히 일치하지 않습니다. 너는 끝이야.

0

클라이언트 클래스에 인터페이스를 선언하고 확장 메소드에 constratint를 추가해야합니다. 이 게시물에 봐 것은 generic extension method

관련 문제