Как просмотреть поставщиков типов в сборке - PullRequest
2 голосов
/ 17 мая 2019

Я просматриваю обозреватель объектов и пытаюсь выяснить, где и как определяются поставщики типов - я просматриваю файл FSharp.Data.dll.Это показывает CsvFile и CsvRow .. но я не мог найти CsvProvider.Где это определено?Стоит ли полагаться только на документацию, чтобы узнать, какие поставщики типов находятся в данной сборке?

1 Ответ

2 голосов
/ 17 мая 2019

FSharp.Data.dll - компонент времени выполнения FSharp.Data. Тип-провайдеры генерируют типы для вас во время компиляции и после этого не нужны. Это dll называется: FSharp.Data.DesignTime.dll.

Вы можете декомпилировать эту dll, но я думаю, что проще взглянуть на исходный код: https://github.com/fsharp/FSharp.Data/blob/master/src/Json/JsonProvider.fs

Что делает поставщик типов, так это то, что он внедряет код и типы, что делает навигацию JSON удобной для вас. Используя такой инструмент, как dnSpy, можно узнать, что на самом деле происходит

Так пример программы

type Simple = JsonProvider<""" { "name":"John", "age":94 } """>
let f (s: string) =
  let s = Simple.Parse s
  s.Name

После декомпиляции его на C # с использованием dnSpy выглядит так:

    public static string f(string s)
    {
        IJsonDocument s2 = (IJsonDocument)JsonDocument.Create(new StringReader(s));
        JsonValueOptionAndPath jsonValueOptionAndPath = JsonRuntime.TryGetPropertyUnpackedWithPath(s2, "name");
        return JsonRuntime.GetNonOptionalValue<string>(jsonValueOptionAndPath.Path, JsonRuntime.ConvertString("", jsonValueOptionAndPath.JsonOpt), jsonValueOptionAndPath.JsonOpt);
    }

Таким образом, строка анализируется в IJsonDocument, а затем s.Name превращается в

    JsonValueOptionAndPath jsonValueOptionAndPath = JsonRuntime.TryGetPropertyUnpackedWithPath(s2, "name");
    return JsonRuntime.GetNonOptionalValue<string>(jsonValueOptionAndPath.Path, JsonRuntime.ConvertString("", jsonValueOptionAndPath.JsonOpt), jsonValueOptionAndPath.JsonOpt);

Код о не нужно FSharp.Data.DesignTime.dll, поэтому он не включен в сборку.

...