2011-04-05 6 views
14

익명 식에서 값을 얻으려면 어떻게해야합니까?

다음과 같은 코드를 상상해보십시오.

public class Foo 
{ 
    public string Bar { get; set; } 
} 

특수한 HTML 도우미 메서드에 전달하십시오.

Html.SomeFunction(f => f.Bar); 

:

public string SomeFunction<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) 

이 함수의 내부에서 Bar의 값을 얻고 싶지만 그것을 얻는 방법을 전혀 모른다.

답변

26

표현식을 컴파일하고 값을 가져 오기만하면됩니다.

Func<TModel, TValue> method = expression.Compile(); 

TValue value = method(html.ViewData.Model); 
// might be a slightly different property, but you can get the ViewModel 
// from the HtmlHelper object. 
+0

코드에서 다음 오류가 발생합니다. 오류 'System.Web.Mvc.HtmlHelper '에 'Model'에 대한 정의가없고 no 확장 메서드 'System.Web.Mvc.HtmlHelper '형식의 첫 번째 인수를 허용하는 '모델'을 찾을 수 있습니다 (사용 지시문이나 어셈블리 참조가 누락 되었습니까?) – mynameiscoffey

+2

'html.ViewData.Model'이어야합니다. 내 초기 게시물은 속성 이름과 함께 서둘러했다. – Tejs

+0

+1 매력처럼 작동합니다. 감사합니다. – mynameiscoffey

5

식에 Compile()을 호출하여 Func을 얻은 다음 실행해야합니다.

public string SomeFunction<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) 
{ 
    TValue valueOfBar = expression.Compile()(html.Model); // Assumes Model is accessible from html. 

    // Do stuff 
} 

사이드 노트 : 동적 표현식이나 표현식 분석이 필요없는 경우 Func을 직접 전달할 수 있습니다.

+1

1; 실제로 표현식을 검사 할 이유가 없다면 단순히 'Func '를 전달하는 것이 훨씬 낫습니다. – Tejs

+1

불행히도 표현식은 메서드 내에서 발생하는 다른 상호 작용에 필요합니다. – mynameiscoffey

0

MVT 모델없이 표현식을 사용하는 경우 다음과 같은 방법으로 속성의 이름과 값을 얻습니다.

public static string Meth<T>(Expression<Func<T>> expression) 
{ 
    var name = ((MemberExpression)expression.Body).Member.Name; 
    var value = expression.Compile()(); 
    return string.Format("{0} - {1}", name, value); 
} 

사용 : Compile()는 로슬린 컴파일러 프레임 워크를 사용하고 동적으로 응용 프로그램에로드됩니다 MSIL 코드를 방출합니다 사용

Meth(() => YourObject.Property); 
0

. 이 실행 코드는 메모리를 차지하며 "정상적인"메모리와 달리 가비지 수집의 대상이 아니며 직접 해제 할 수도 있습니다. 이 작업을 너무 자주 수행하면 (예 : SQL 생성 중에 정기적으로) 메모리가 부족하게됩니다. 나는이 문제에 달려 오픈 소스 라이브러리로 내 솔루션을 오픈 소스 화 :

Reddog도 여기에 진실을 말하는

https://www.nuget.org/packages/MiaPlaza.ExpressionUtils

관련 문제