您将需要使用标准的.NET反射来执行此操作。引用不会有帮助,因为它们使用标准的.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)
你可以更多地展示你想要做的事情吗? – Daniel 2011-06-03 22:00:55