繁体   English   中英

从 F# 调用 C# 函数

[英]Calling C# functions from F#

我试图从 f# 调用这个 function

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

function 签名为:

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 委托类型,例如Action 这意味着您可以像这样直接使用 lambda function 作为SetConfigurationSettingPublisher的参数:

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

多个 arguments 的 function 可以转换为多个 arguments 的委托(ZDBC11CAA5BDA99F77E6FB4DABD882) setter的类型仍然是Func<...>而不是简单的 F# function,因此您需要使用Invoke方法调用它(但这应该没什么大不了的)。

如果您想将setterFunc<string, bool>转换为 F# function string -> bool ,您可以定义一个简单的活动模式:

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

...然后你可以写:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM