2009-12-21 1 views
4

다음 코드와 같이 람다 식을 사용하여 일부 클래스의 속성이나 메서드를 캡처 할 경우 많은 이점이 있습니다.람다 식을 사용하여 정적 또는 비 정적 속성을 캡처하는 방법은 무엇입니까?

void CaptureProperty<T, TProperty> (Func<T, TProperty> exp) 
{ 
    // some logic to keep exp variable 
} 

// So you can use below code to call above method. 
CaptureProperty<string, int>(x => x.Length); 

그러나 위 코드는 정적 속성을 지원하지 않습니다. 그렇다면 정적 속성과 비 정적 속성을 모두 지원하는 메서드를 만드는 방법은 무엇입니까?

감사합니다,

답변

7

글쎄, 당신은 캡처 정적 속성 방법 :

CaptureProperty<string, Encoding>(x => Encoding.UTF8); 
그런 다음하지만 실행 시간에 "더미"값을 제공해야

...

하나의 유형 인수만으로 다른 오버로드를 제공 할 수 있습니다.

(210)
void CaptureProperty<T>(Func<T> func) 
{ 
    // Whatever 
} 

사용은 다음과 같이이다 :

CaptureProperty<Encoding>(() => Encoding.UTF8); 

당신이 후에 어떤 것인가요? 내부적으로 두 가지를 통합하고 싶었다면

, 당신은 CaptureProperty 같은 유형 내에서 "더미"개인 중첩 된 유형이이 같은 정적 버전을 구현할 수 :

void CaptureProperty<T>(Func<T> func) 
{ 
    CaptureProperty<DummyType, T>(x => func()); 
} 

그런 다음 당신이 있음을 감지 할 수를 나중에 함수를 호출해야하는 경우 "소스"유형은 DummyType입니다. 이것은 당신이하는 일에 따라 유용한 아이디어 일 수도 있고 그렇지 않을 수도 있습니다.

+0

위대한! 빈 매개 변수 식입니다. –

+0

캡쳐 된 속성을 JavaScript로 보내기 위해 "{className}. {propertyName}"(으)로 변환하려고합니다. –

+0

@Soul_Master :이 경우에는 'Func '대신'Expression >'을 사용하십시오. –

관련 문제