从F调用C#函数#

从F调用C#函数#,c#,f#,C#,F#,我试图从f调用这个函数# 函数签名为: CloudStorageAccount.SetConfigurationSettingPublisher (Action<string, Func<string, bool>>) : unit 而在F#中,我不得不这样做: CloudStorageAccount.SetConfigurationSettingPublisher((configName,

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

函数签名为:

CloudStorageAccount.SetConfigurationSettingPublisher
      (Action<string, Func<string, bool>>) : unit
而在F#中,我不得不这样做:

CloudStorageAccount.SetConfigurationSettingPublisher((configName,
                                                  configSettingPublisher) =>
{
    string configValue = "something"
    configSettingPublisher(configValue);
});
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)
CloudStorageAccount.SetConfigurationSettingPublisher(fun configName setter ->
    let configValue = RoleEnvironment.GetConfigurationSettingValue(configName)
    setter.Invoke(configName) |> ignore)
让myPublisher配置名称(setter:Func)=
让configValue=RoleEnvironment.GetConfigurationSettingValue(configName)
setter.Invoke(configName)|>忽略
let act=新操作(myPublisher)
CloudStorageAccount.SetConfigurationSettingPublisher(act)
这可以用f#写得更简洁些吗

F#自动转换使用
fun…->创建的lambda函数语法到.NET委托类型,如
操作
。这意味着您可以直接使用lambda函数作为
SetConfigurationSettingPublisher
的参数,如下所示:

CloudStorageAccount.SetConfigurationSettingPublisher((configName,
                                                  configSettingPublisher) =>
{
    string configValue = "something"
    configSettingPublisher(configValue);
});
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)
CloudStorageAccount.SetConfigurationSettingPublisher(fun configName setter ->
    let configValue = RoleEnvironment.GetConfigurationSettingValue(configName)
    setter.Invoke(configName) |> ignore)
具有多个参数的函数可以转换为具有多个参数的委托(参数不应被视为元组)。
setter
的类型仍然是
Func
而不是简单的F#函数,因此需要使用
Invoke
方法调用它(但这应该不是什么大问题)

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

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

请注意,“自动转换”仅适用于方法参数。