gpt4 book ai didi

c# - 从函数中提取函数名

转载 作者:行者123 更新时间:2023-11-30 17:38:49 25 4
gpt4 key购买 nike

我如何创建一个名为 getFuncName 的函数,它接受类型为 (unit -> 'a) 的函数并返回其名称。

我正在与一位 C# 开发人员交谈,他们说您可以在 Func 类型上使用 .Method 属性,如示例所示here .

我试图将其转换为 F#:

例如将 (unit -> '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

虽然可能有更简单的方法。

关于c# - 从函数中提取函数名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36324339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com