gpt4 book ai didi

c# - 从 F# 调用 C# 函数

转载 作者:太空狗 更新时间:2023-10-30 00:08:41 30 4
gpt4 key购买 nike

我试图从 f# 调用这个函数

http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.cloudstorageaccount.setconfigurationsettingpublisher.aspx

函数签名是:

CloudStorageAccount.SetConfigurationSettingPublisher
(Action<string, Func<string, bool>>) : unit

C# 调用是这样的:

CloudStorageAccount.SetConfigurationSettingPublisher((configName,
configSettingPublisher) =>
{
string configValue = "something"
configSettingPublisher(configValue);
});

而在 F# 中,我必须这样做:

let myPublisher configName (setter:Func<string, bool>) =
let configValue = RoleEnvironment.GetConfigurationSettingValue(configName)
setter.Invoke(configName) |> ignore

let act = new Action<string, Func<string, bool>>(myPublisher)

CloudStorageAccount.SetConfigurationSettingPublisher(act)

这可以用 f# 写得更简洁吗?

最佳答案

F# 自动转换使用 fun ... -> ... 创建的 lambda 函数.NET 委托(delegate)类型的语法,例如 Action .这意味着您可以使用 lambda 函数作为 SetConfigurationSettingPublisher 的参数直接这样:

CloudStorageAccount.SetConfigurationSettingPublisher(fun configName setter ->
let configValue = RoleEnvironment.GetConfigurationSettingValue(configName)
setter.Invoke(configName) |> ignore)

可以将多参数函数转换为多参数委托(delegate)(不应将参数视为元组)。 setter 的类型还是Func<...>而不是简单的 F# 函数,因此您需要使用 Invoke 调用它方法(但这应该不是什么大问题)。

如果要转setter来自 Func<string, bool>到 F# 函数 string -> bool ,您可以定义一个简单的事件模式:

let (|Func2|) (f:Func<_, _>) a = f.Invoke(a)

...然后你可以写:

TestLib.A.SetConfigurationSettingPublisher(fun configName (Func2 setter) ->
let configValue = "aa"
setter(configName) |> ignore)

关于c# - 从 F# 调用 C# 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6524242/

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