Получение всех привязок модуля с отражением - PullRequest
1 голос
/ 23 октября 2019

Я пытался получить все поля привязки let модуля F #, но мне трудно.

System.Reflection.Assembly.GetExecutingAssembly().GetTypes()
|> Seq.collect(fun t -> t.GetFields())

, но похоже, что он не возвращает привязки. (код сокращен, а типы - только модули)

1 Ответ

2 голосов
/ 25 октября 2019

Предполагая, что вам нужны только привязки let, а не какие-либо типы, определенные внутри модуля, вы можете использовать следующие фильтры для членов типа модуля:

open System.Reflection
open System.Runtime.CompilerServices

module Test =
    type Marker = interface end

    let x = 3

    let f x = x * x

    let m = List.map


let moduleType = typeof<Test.Marker>.DeclaringType

moduleType.GetMembers()
|> Array.filter (fun m -> m.DeclaringType = moduleType)
|> Array.filter (fun m -> m.IsDefined(typeof<CompilerGeneratedAttribute>, true) |> not)
|> Array.filter (fun m -> m.MemberType <> MemberTypes.NestedType)
|> Array.map (fun m -> m.Name)

Это вернет вам: [|"f"; "m"; "x"|]

...