如何在F#中实现带有params参数的C#委托?
问题原因
你此前编写的委托存在两个和C#原始定义不兼容的问题:
- 签名结构不匹配:你定义的是接收单个元组参数的委托,而C#原始委托是两个独立的入参(string类型的方法名、object数组类型的参数列表),CLR层面的委托签名不一致,导致调用库函数失败。
- 缺少params对应特性:C#的
params关键字对应F#中的[<ParamArray>]特性,你没有给数组参数添加该特性,可变参数的调用逻辑无法兼容。
正确实现
open System type InvokeDelegate = delegate of method: string * [<ParamArray>] parameters: obj[] -> obj
调用说明
添加[<ParamArray>]特性后,该委托和C#原始定义完全等价,支持两种调用方式:
- 零散传参(和C# params用法一致):
let impl methodName (parameters: obj[]) = // 此处编写委托逻辑示例 box $"调用方法{methodName},参数个数{parameters.Length}" let del = InvokeDelegate(impl) // 直接传递多个零散参数,不需要手动打包数组 let result = del.Invoke("GetUser", 1001, "admin", DateTime.Now)
- 直接传递数组:
let paramArr = [| box 1001; box "admin"; box DateTime.Now |] let result = del.Invoke("GetUser", paramArr)
内容的提问来源于stack exchange,提问作者Paul Biggar
相关产品推荐
相关产品推荐

