Как получить тип модуля в F #
Как получить 'System.Type' модуля?
Например, модуль:
module Foo =
let bar = 1
И это не работает:
printfn "%s" typeof<Foo>.Name
Ошибка:
The type 'Foo' is not defined
Ответы
Ответ 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
- это имя модуля, второе - тип.