2014-11-17 4 views
1

모든 인스턴스의 속성 이름과 해당 값의 목록이 포함 된 클래스의 문자열을 작성하려고합니다. 이러한 방식으로람다 식을 통해 전달 된 중첩 된 속성의 값 가져 오기

Private Function GetPropertyValuePair(Of T)(lambda As Expression(Of Func(Of T, Object))) As String 
    Dim body As Expression = lambda 

    'ensure we have the right type of thing 
    If TypeOf body Is LambdaExpression Then body = DirectCast(body, LambdaExpression).Body 
    If TypeOf body Is UnaryExpression Then body = DirectCast(body, UnaryExpression).Operand 
    If body.NodeType <> ExpressionType.MemberAccess Then Throw New InvalidOperationException() 

    'get property info 
    Dim memberInfo = DirectCast(body, MemberExpression).Member 
    Dim propInfo = DirectCast(memberInfo, PropertyInfo) 

    Return propInfo.Name + " - " + propInfo.GetValue(Me, Nothing) 
End Function 

, 나는를 복용하여 현재 값을 받고 있어요 : 질문 Get Property Info from an object without giving the property name as string

, 나는 이런 유형 T, Object의 유형 FuncExpression 사용하여 속성 이름을 얻고있다 PropertyInfoGetValue을 사용하여 해당 속성에 대한 현재 인스턴스를 검색합니다.

그럼 이런 식으로 호출 할 수 있습니다 :

GetPropertyValuePair(Of Foo)(Function(x) x.Bar) 

생산됩니다 어떤 :

Bar - WhateverTheValueIsForBar 

를 내가있을 때 문제이되는 속성이 중첩, GetValue가 발생합니다 때 예외 :

개체가 대상 유형과 일치하지 않습니다.

예를 들어, 다음 식을 실행에 :

GetPropertyValuePair(Of Foo)(Function(x) x.Bar.Car) 

속성 정보는 Foo에서 직접 찾을 수없는 유형 Car의 될 것입니다.

처음에 GetValue로 검색 할 필요없이 원본 람다 식에서 인스턴스 값을 얻을 수 있습니까?

이것은 MVC @Html.EditorFor 도우미 가능합니다, 그래서의 가치를 제공하기위한 몇 가지 메커니즘이 있어야 이런 일에 대한 기능을 건네 :

@Html.EditorFor(Function(model) model.Bar.Car) 

어떤 아이디어?

답변

1

How to evaluate a lambda expression에 기초한 용액을 함께 분해 하였다.

Compile 표현식을 사용하여 그 내부에 실행 가능 함수를 생성 할 수 있습니다.

Dim func = lambda.Compile() 
Dim output = func(Me) 

난 아직도 람다를 통해 내 방식대로 일하고 있어요 때문에이 여기에 설명의 방법으로 좀 더 : 식 내부

, 우리는이 Func(Of T, Object)
처럼 보이게하는 기능 서명 선언 이 메소드를 호출했을 때, 우리는 함수의 평가가 다음과 같이 동작하도록했습니다. x => x.Bar.Car

컴파일은 로컬 변수로 저장되는 새로운 함수를 제공합니다. 다음과 같이 있습니다

Function Anonymous(x as T) As Object 
    Return x.Bar.Car 
End 

그래서 우리는 실제로 모든에서 인스턴스에 전달하지 않았습니다. 우리는이 익명의 함수를 T라는 타입으로 전달할 때 일어날 일에 대한 정의를 전달했습니다.

그래서 우리는 여전히 Me을 가져와야합니다. 이 경우이 함수는 같은 클래스 안에 있기 때문에 메소드가 이미 인스턴스 변수에 액세스 했으므로 조금만 속였습니다. 그것이 어딘가에서 추상화 되었다면, 인스턴스 자체는 부가적인 매개 변수로서 전달되어야 할 것이다.

관련 문제