2012-12-06 5 views
0

익명 형식을 메서드에서 반환 할 수 없다는 것을 알고 있습니다. 또한이를 해결할 수있는 방법이 있음을 이해합니다. 내 질문은 어떤 방법 Linq 공급자를 사용합니까? 예를 들어 Linq 공급자의 작동 방식에 대한 이해가 부족한 경우 Select() 확장 방법은 IQueryable에 적용되며 표현식 트리는 Linq 공급자가 구문 분석하고 SQL로 바꾸고 쿼리 결과를 구문 분석하여 형식 및 그때 .... 돌아왔다.Select() 메서드는 익명 형식을 어떻게 반환합니까?

따라서 Select()을 반환하는 기술은 예를 들어 엔티티 프레임 워크 또는 NHibernate?

+1

여기에 무엇을 묻는 지 완전히 모르겠지만, 1 - 메서드는 익명 형식을 반환 할 수 있습니다. 2 - Select()는 IEnumerable을 반환합니다. series0ne

답변

3

제네릭을 사용합니다. 형식 유추를 통해 컴파일러는 익명 형식의 정확한 형식을 알고 있습니다.
컴파일러는 익명 유형에 대한 클래스를 자동 생성합니다. 그 후에는 다른 유형과 같은 유형 일뿐입니다.

public IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> items, 
                Func<TSource, TResult> converter) 
{ 
    foreach(var item in items) 
     yield return converter(item); 
} 

당신은 당신의 방법에서 익명 형식을 반환 할 수 있습니다. 문제는 익명 형식의 형식 이름을 알 수 없기 때문에 강력하게 형식화 할 수 없다는 것입니다.하지만 컴파일러가 익명 ​​형식을 사용하는 이유는이 때문입니다.

당신이 말하는 해결 방법은 제네릭을 사용하는 것입니다.

+0

아, 알겠습니다. 나는 그것을 얻습니다. 'Select()'에 전달하는'x => new {Blah = x.Blah} '매개 변수는 새로운 유형을 생성하는 변환기입니다. 컴파일러는 형식에 대해 모두 알고 있습니다. 익명의 타입을 고려하는 것은 프로그래머로서의 당신입니다. 설명해 주셔서 감사합니다. – David

+0

그래서 실제로는 익명의 타입을 리턴 할 수있는 메소드를 생각할 수 있습니다. 리턴 타입이 일반형이고 타입을 식별하는 매개 변수를 받아들입니다 ('Func '의'TResult' 부분). 귀하의 예를 들어? – David

+0

@David : 첫 번째 의견 : 정확히 –

2

제네릭을 사용한다고 생각하기 때문에 반환 유형이 "익명"으로 보이지만 사용중인 데이터 형식 때문에 알 수 있습니다. 단순한 사실은

, 프로그램 (한 번 컴파일)을 코딩 할 때 (또는 운영)에 전달되는 유형

당신은 read some more on generics here 수, 그들은 매우 매우 유용 할 수 있습니다에 따라 반환하려면 정확한 유형을 알고있다 - 언제 적절하게 사용해야하는지 알고있는 한

+1

답해 주셔서 감사합니다. 제네릭을 사용하지만, 배울 점이 많습니다. 뮤즈는 대단해! – David

관련 문제