2011-06-14 5 views
1
| P.Call(_, mi, [P.Value(value, _); P.PropertyGet(q, propInfo, [])]) -> ... 

가 어떻게 propInfo의 값을 얻기 위해서 (때문에), GetValue 방법을 사용해야합니까? @Stephen Swensen '제안을 바탕으로F 번호 - 반사, 패턴 매칭 : GetValue

편집

, 내가 할 시도했다 :

TargetException이 처리되지 않은이었다 그러나

| P.Call(_, mi, [P.Value(value, _); P.PropertyGet(q, pi, [])]) -> 
    match q.Value with 
    | P.PropertyGet(_, pi2, []) -> printfn "%A" <| pi.GetValue(pi2, null) 
    | _ -> failwith "fail" 

, 단순히 예외를 throw : 개체 이 대상 유형과 일치하지 않습니다.

런타임 pi2의 값 : Some({PropertyGet (None, Author r, [])})

EDIT

Bahh ... pi2 정적 didnt 한 것을 통지.

솔루션이다 : 그것은 (정적 또는 인스턴스)하고 있는지 여부는 어떤 인수를 재산의 종류 따라

| P.Call(_, mi, [P.Value(value, _); P.PropertyGet(q, pi, [])]) -> 
    match q.Value with 
    | P.PropertyGet(_, pi2, []) -> 
     let getObj = pi2.GetValue(null, null) 
     printfn "%A" <| pi.GetValue(getObj, null) 
    | _ -> failwith "fail" 

답변

2

.

귀하의 패턴 일치를 기반으로 귀하의 속성이 어떤 인수도 취하지 않는 것처럼 보입니다. 따라서 우리는 그 사실을 무시할 것입니다.

정적 속성 인 경우 qNone이고 propInfo.GetValue(null, null)으로 전화하면됩니다.

인스턴스 속성 인 경우 qSome(instance)이고 instanceExpr입니다. 그것은 문제를 제시합니다. 표현식을 GetValue의 첫 번째 인수로 전달할 수있는 값으로 변환 할 수 있어야합니다. 그러나 표현이 임의로 복잡하다면 표현식 평가기를 구현하는 데 많은 작업이 필요합니다.

+0

이것은 인스턴스 속성입니다. 'propInfo.GetValue (instance, null)'을 실행하면 예외를 throw합니다. TargetException was unhandled : Object가 대상 유형과 일치하지 않습니다. 어떤 제안? - 조금이라도 참고가된다면, 나는 그 목록이 차이를 만들지 확실하지 않은 목록을 전달할 것이다. – ebb

+0

@ebb : 맞습니다. 나 자신보다 앞섰습니다. 인스턴스를 나타내는 'Expr'이 인스턴스 자체의 값이 아니라 인스턴스를 나타내는 것을 알고 난 후에 내 대답을 업데이트했습니다. –

+0

@ebb : "목록"을 전달하는 것에 관해 당신이 의미하는 바가 확실하지 않습니다. –