从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
方法调用它(但这不应该是一个大问题)。
如果要将setter
从Func
转换为F#函数string -> bool
,则可以定义一个简单的活动模式:
let (|Func2|) (f:Func<_, _>) a = f.Invoke(a)
……然后你可以写:
TestLib.A.SetConfigurationSettingPublisher(fun configName (Func2 setter) -> let configValue = "aa" setter(configName) |> ignore)