F # - отражение, сопоставление с образцом: GetValue - PullRequest
1 голос
/ 14 июня 2011
| P.Call(_, mi, [P.Value(value, _); P.PropertyGet(q, propInfo, [])]) -> ...

Как бы я использовал метод GetValue, чтобы получить значение для propInfo?

РЕДАКТИРОВАТЬ

На основе @StephenПредложение Свенсена, которое я пытался сделать:

| 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"

Однако оно просто выдает исключение:

TargetException не обработано: объект не соответствует типу цели.

Значение pi2 во время выполнения: Some({PropertyGet (None, Author r, [])})

РЕДАКТИРОВАТЬ

Бах ... не заметил, что pi2статическое.

Решение:

| 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"

1 Ответ

2 голосов
/ 14 июня 2011

Это зависит от того, какое это свойство (статическое или экземплярное), и принимает ли оно какие-либо аргументы.

Исходя из вашего соответствия шаблону, похоже, что ваше свойство не принимает никаких аргументов, поэтому мы отложим это в сторону.

Если это статическое свойство, то q равно None, и вам просто нужно вызвать propInfo.GetValue(null, null).

Если это свойство экземпляра, тогда q - это Some(instance), где instance - это тип Expr. Это представляет проблему. Вы должны иметь возможность преобразовать выражение в значение, которое вы можете передать в качестве первого аргумента, в GetValue. Но если выражение является сколь угодно сложным, для реализации оценщика выражения потребуется много работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...