2016-11-06 6 views
2

Я хотел бы получить типизированное значение для поля из записи в Quotation. Похоже, это должно быть прямо, но я немного потерян.Получите значение поля из цитаты и введите его тип

Е.Г.,

type FullName = { First : string; Last : string } 

type Name = { Name : FullName } 

let t = { Name = { First = "Jon"; Last = "N" } } 

let name = <@ t.Name.First @> 

Тогда я хотел бы взять значение name и получить Jon как string (не obj). Как мне это сделать? Иногда возвращаемое значение может быть Array или другое Record.

Заранее благодарен!

Update:

Я буду использовать эту функцию по краям F # поэтому необходимо проверить null:

let getValue (expr: Quotations.Expr<'t>) = 
    match eval expr with 
    | null -> None 
    | x -> Some ((eval expr) :?> 't) 
+0

Похоже, вам нужно скомпилировать и выполнить цитату. Или я чего-то не хватает? – Gustavo

+0

Как извлечь фактическое значение из предложения с его типом? Извините, я не уверен, как сделать это более понятным. – Jon49

+0

Сейчас я просто играю с ним в сценариях. Я нашел этот фрагмент, который доставит меня на полпути, но он возвращает его на 'obj' http://www.fssnip.net/h1 – Jon49

ответ

4

eval script, что вы связаны получите вы на полпути там - он будет вычислять фактическое значение выражения для вас. Теперь все, что осталось сделать, это бросить это значение к соответствующему типу:

let getValue (expr: Quotations.Expr<'t>) = (eval expr) :?> 't 

let valueOfName = getValue name // valueOfName : string 

Имейте в виду, что теоретически бросок может привести к сбою, но на практике это не должно произойти, потому что eval всегда будет возвращать значение правильного типа (если в нем нет ошибки).

Смежные вопросы