从F#调用C#函数

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

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

function签名是:

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

C#调用是这样的:

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

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

 let myPublisher configName (setter:Func) = let configValue = RoleEnvironment.GetConfigurationSettingValue(configName) setter.Invoke(configName) |> ignore let act = new Action<string, Func>(myPublisher) CloudStorageAccount.SetConfigurationSettingPublisher(act) 

这可以在f#中更简洁地写出来吗?

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

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

可以将多个参数的函数转换为多个参数的委托(不应将参数视为元组)。 setter的类型仍然是Func<...>而不是简单的F#函数,所以你需要使用Invoke方法调用它(但这不应该是一个大问题)。

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

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

……然后你可以写:

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