您需要使用标准的 .NET Reflection 来执行此操作。引用不会有帮助,因为它们表示使用标准 .NET 的函数调用MethodInfo
,所以无论如何您都需要使用反射。引用的唯一好处(与天真的反射相比)是您可以编译它们,这可以为您提供更好的性能(但编译并不完美)。
根据您的具体情况(例如函数的位置),您必须执行以下操作:
module Functions =
let sin x = sin(x)
let sqrt y = sqrt(y)
open System.Reflection
let moduleInfo =
Assembly.GetExecutingAssembly().GetTypes()
|> Seq.find (fun t -> t.Name = "Functions")
let name = "sin"
moduleInfo.GetMethod(name).Invoke(null, [| box 3.1415 |])
除非您需要一些可扩展性或具有大量函数,否则使用包含字符串作为键和函数值作为值的字典可能是一个更简单的选择:
let funcs =
dict [ "sin", Functions.sin;
"sqrt", Functions.sqrt ]
funcs.[name](3.1415)