Как получить тип модуля в F # - PullRequest
19 голосов
/ 19 февраля 2010

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

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

module Foo =
     let bar = 1

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

printfn "%s" typeof<Foo>.Name

Ошибка:

The type 'Foo' is not defined

Ответы [ 4 ]

30 голосов
/ 05 февраля 2013

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

module Foo =  
    type internal Marker = interface end
    let t = typeof<Marker>.DeclaringType
8 голосов
/ 19 февраля 2010

Было бы неплохо иметь оператор 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, но это больше зависит от хорошего понимания скомпилированной формы, которую принимает ваш модуль.

5 голосов
/ 29 октября 2014

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

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 @>

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

0 голосов
/ 19 февраля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...