Могу ли я проанализировать некоторый код F # во время выполнения, который ссылается на типы в моей текущей сборке? - PullRequest
0 голосов
/ 12 марта 2019

Скажите, что у меня определен следующий тип:

type Foo = { A: string; B: int }

Я хочу функцию parse, такую ​​что:

let myfoo = parse<Foo> "{A = \"foo\"; B = 5}"

дает мне экземпляр типа Foo (или ошибка).

Возможно ли это с помощью FSharp.Compiler.Service?

UPDATE:

Хотя есть и другие вопросы, касающиеся разбора кода F #, они не касаются наличия ссылок в текущей сборке.

1 Ответ

0 голосов
/ 13 марта 2019

Вы можете сделать это, ссылаясь на текущую сборку из размещенного интерактивного F # - это работает, только если вы запускаете это из скомпилированной программы (в которой сборка расположена на диске) и если ваши типы общедоступны, но это может сделатьуловка в вашем случае.

Учитывая обычную настройку, задокументированную на интерактивной странице Embedded F # , вы можете сделать что-то вроде этого:

module Program

type Test = { A:int; B:string }

// (omitted code to initialize the fsi service)
let fsiSession = FsiEvaluationSession.Create(...)    

// Run #r command to reference the current assembly  
let loc = System.Reflection.Assembly.GetExecutingAssembly().Location
fsiSession.EvalInteraction(sprintf "#r @\"%s\"" loc)

// Open the module or namespace containing your types
fsiSession.EvalInteraction("open Program")

// Evaluate code using the type and cast it back to our type
let value = fsiSession.EvalExpression("{A=0; B=\"hi\"}").Value.ReflectionValue :?> Test
printfn "%A" value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...