对如何获取有关模块包含的功能的信息的问题感兴趣。我想得到类似 FSI 问题的东西。
例如对于以下模块
module Test =
let ign _ = ()
let getNowDateTime() = System.DateTime.Now
let getNumbers count = [1..count]
FSI 显示此类信息
module Test = begin
val ign : 'a -> unit
val getNowDateTime : unit -> System.DateTime
val getNumbers : count:int -> int list
end
我尝试通过反射获取数据如下
let getInfoAboutModule (t : Type) =
let genericToString (t : Type) =
match t.GenericTypeArguments with
| [| |] -> t.FullName
| x ->
x
|> Seq.map (fun x -> x.Name)
|> String.concat ","
|> sprintf "%s<%s>" t.Name
let getInfo (mi:MethodInfo) =
let parameter =
let sb = System.Text.StringBuilder()
for x in mi.GetParameters() do
x.ParameterType
|> genericToString
|> sprintf "%s : %s ->" x.Name
|> sb.Append
|> ignore
sb.ToString()
|> fun str -> if str |> System.String.IsNullOrEmpty then "unit -> " else str
sprintf "%s : %s %s" mi.Name parameter (genericToString mi.ReturnType)
t.GetMethods(BindingFlags.Public ||| BindingFlags.Static)
|> Seq.map getInfo
对于模块,Test
结果如下
ign : _arg1 : -> System.Void
getNowDateTime : unit -> System.DateTime
getNumbers : count : System.Int32 -> FSharpList`1<Int32>
但是,当然,通过这种方式我得到的名字与 F# 相去甚远。
PS 您不能向模块添加任何属性,因为 您需要保留从其他程序集的模块中提取数据的能力。