Подтвердить что ты не робот

Как получить тип модуля в F #

Как получить 'System.Type' модуля?

Например, модуль:

module Foo =
     let bar = 1

И это не работает:

printfn "%s" typeof<Foo>.Name

Ошибка:

The type 'Foo' is not defined
4b9b3361

Ответ 1

Было бы неплохо иметь оператор moduleof... Поскольку нет ни одного, самый простой способ сделать то, что вы хотите, вероятно, использовать библиотеку метаданных в F # PowerPack:

#r "FSharp.PowerPack.Metadata.dll" 
open Microsoft.FSharp.Metadata

// get .NET assembly by filename or other means
let asm = ...

let fasm = FSharpAssembly.FromAssembly asm
let t = fasm.GetEntity("Foo").ReflectionType

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

Ответ 2

Вы можете добавить к модулю маркер, а затем узнать тип модуля:

module Foo =  
    type internal Marker = interface end
    let t = typeof<Marker>.DeclaringType

Ответ 3

Это также можно сделать, используя Котировки. Сначала определите эту вспомогательную функцию где-нибудь:

open Microsoft.FSharp.Quotations.Patterns

let getModuleType = function
| PropertyGet (_, propertyInfo, _) -> propertyInfo.DeclaringType
| _ -> failwith "Expression is no property."

Затем вы можете определить модуль и получить его тип следующим образом:

module SomeName =
    let rec private moduleType = getModuleType <@ moduleType @>

Надеюсь, что это поможет.

Ответ 4

имя модуля не является типом.

List в List.map и let (a:List<int>) = [1;2;3] различны.

Первый List - это имя модуля, второе - тип.