2009-09-02 2 views
4

(코드 예입니다 주)것으로 someMethod (() => x.Something) C#으로 의미

나는 다음과 같은 구문 한 기능 :

SomeMethod(() => x.Something) 

을 무엇 처음 브래킷 표현의 의미?

전달되는 인수에서 속성 이름을 가져 오는 방법이 궁금합니다.이게 가능합니까?

+0

중복 : http://stackoverflow.com/questions/630330/what-does-mean-in-c/630344#630344 –

+0

괜찮습니다. 나는 'SomethMethod (x => xSomething)'과 어떻게 다른지 궁금하다. –

답변

7
: 동일 아니 PARAMATERS이없고 x.someproperty

delegate{ 
return x.someproperty; 
} 

의 타입을 반환 위임

식에서 첫 번째 대괄호는 무엇을 의미합니까?

매개 변수를 사용하지 않는 방법의 경우 람다 구문입니다.이 1 개 매개 변수를했다 경우, 그것은 것 :

SomeMethod(x => x.Something); 

는 N + 1 개 인수했다 경우, 그것은 것 :

SomeMethod((x, y, ...) => x.Something); 

나는 또한 당신이 얻을 수있는 방법 궁금 건네받은 인수의 프롭퍼티 명. 이것이 가능합니까?

당신의 SomeMethod 다음 예, Expression<Func<T>> 걸리는 경우 :

void SomeMethod<T>(Expression<Func<T>> e) { 
    MemberExpression op = (MemberExpression)e.Body; 
    Console.WriteLine(op.Member.Name); 
} 
2

이것은 lambda expression입니다. 즉 익명의 함수 또는 대리자를 만드는 방법입니다. 당신이

() => expression 

는 다음 인수가없는 함수를 만든 경우

(input parameters) => expression 

하고 식의 결과를 반환

일반적인 형태입니다.

C#은 type inference을 사용하여 값의 유형을 파악하고 로컬 변수 (예 : "x"변수)를 lexical closure으로 캡처합니다.

6

()은 빈 인수 목록입니다. 인수를 취하지 않고 익명 함수를 정의하면 x.Something을 반환합니다.

편집 : 후자는 인수가 필요하며 그 인수에 Something이 호출된다는 점이 x => x.Something과 다릅니다. 이전 버전의 x은 함수 밖의 어딘가에 존재해야하며 뭔가가 외부의 x에 호출되어야합니다. 후자의 버전에서는 바깥 쪽 x가있을 필요는 없으며 함수가 있다고해도 뭔가가 여전히 함수에 대한 인수로 호출됩니다.

1

()는이 매개 변수를 사용하지 않음을 의미합니다. 당신이 람다 표현식을 사용하여 일반 이벤트 핸들러를 할당하는 경우 예를 들어, 그것은 다음과 같을 것이다 :

someButton.Click += (s, e) => DoSomething(); 
2

내가 x는 어딘가에 방법 내부에 선언 된 가정, 만약 그렇다면, 당신은이 람다 식을 비교할 수 있습니다

() => x.someproperty 
+0

전자는 컴파일되지 않을 것이다. – Dykam

+0

@Dyamam, 누가 그랬 겠지? 그것은 할 것이다. 이 예제를 컴파일하려고하면 : http://cleigomes.net/powersource/Output.aspx?fl=3w1e3djw.she – Cleiton

+0

그래서 리턴 타입을 가정합니까? –

0

는 것으로 someMethod가 System.Linq.Expressions.Expression<System.Func<object>>의 유형의 인수가 필요 속성의 이름을 얻으려면. 그런 다음 표현식을 통해 속성 이름을 결정할 수 있습니다. 다른 접근 방법을 정확하게 두 번째 질문에 대해 논의하고 제공