Было бы неплохо иметь оператор 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."
Затем вы можете определить модуль и получить его тип следующим образом: