如何创建一个名为getFuncName的函数,它接受类型函数(unit – >’a)并返回其名称.
我正在与其中一个C#开发人员交谈,他们说你可以在Func类型上使用.Method属性,如示例here所示.
我试图将其转换为F#:
例如,将(单位 – >’a)转换为类型Func< _>然后在它上面调用属性,但它总是返回字符串“Invoke”.
let getFuncName f = let fFunc = System.Func<_>(fun _ -> f()) fFunc.Method.Name let customFunc() = 1.0 // Returns "Invoke" but I want it to return "customFunc" getFuncName customFunc
这个问题的一些背景是:
我创建了一个类型的函数数组(unit – > deedle.Frame).我现在想循环调用它们的那些函数并将它们保存到csv,其中csv名称与函数同名.一些假设代码如下:
let generators : (unit -> Frame<int,string>) array = ... generators |> Array.iter (fun generator -> generator().SaveCsv(sprintf "%s\%s.csv" __SOURCE_DIRECTORY__ (getFuncName generator)))
这用于脚本意义而不是应用程序代码.
解决方法
不知道你是如何搜索信息的,但是对搜索引擎的第一个查询给了我这样的回复:
let getFuncName f = let type' = f.GetType() let method' = type'.getmethods() |> Array.find (fun m -> m.Name="Invoke") let il = method'.getmethodBody().GetILAsByteArray() let methodCodes = [byte OpCodes.Call.Value;byte OpCodes.Callvirt.Value] let position = il |> Array.findindex(fun x -> methodCodes |> List.exists ((=)x)) let MetadataToken = BitConverter.ToInt32(il,position+1) let actualMethod = type'.Module.ResolveMethod MetadataToken actualMethod.Name
Unfortunately,this code only works when F# compiler does not inline function body into calling method.
取自here
虽然可能有一种更简单的方法.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。