微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 从函数中提取函数名称

如何创建一个名为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] 举报,一经查实,本站将立刻删除。

相关推荐