首页 > 解决方案 > 如何将此 C# 函数转换为 F# 函数

问题描述

我正在将一些代码从 C# 传递到 F#,并且遇到了以下扩展方法,它添加了一些 mongo 设置。

public static class Container
    {
        public static IServiceCollection AddServicesFromInfrastructure(this IServiceCollection services, IConfiguration configuration)
        {
            services.Configure<MongoDBSettings>(configuration.GetSection(nameof(MongoDBSettings)));
            services.AddSingleton<IMongoDBSettings>(sp => sp.GetRequiredService<IOptions<MongoDBSettings>>().Value);
            return services;
        }
    }

我进行了以下转换,一切都很好,问题出在 AddSingleton 方法内部的 lambda 中。

module Extensions =    

    type IServiceCollection with
        member this.AddMongoDBConfiguration(configuration: IConfiguration) =
            this.Configure<MongoDBSettings>(configuration.GetSection("MongoDBSettings")) |> ignore
            this.AddSingleton<IMongoDBSettings>(fun sp -> sp.GetRequiredService<IOptions<MongoDBSettings>>().Value) |> ignore
            this

此行返回错误:

方法“AddSingleton”没有重载匹配。

已知参数类型:(IServiceProvider -> MongoDBSettings)

this.AddSingleton<IMongoDBSettings>(fun sp -> sp.GetRequiredService<IOptions<MongoDBSettings>>().Value) |> ignore

将该 lambda 函数转换为 F# 的正确方法是什么?

感谢阅读,我是 F# 新手

标签: c#f#

解决方案


尝试这样调用:

module Extensions =    

    type IServiceCollection with
        member this.AddMongoDBConfiguration(configuration: IConfiguration) =
            this.Configure<MongoDBSettings>(configuration.GetSection("MongoDBSettings")) |> ignore
            this.AddSingleton<IMongoDBSettings>(Func<_,_>(fun (sp: IServiceProvider) -> 
                sp.GetRequiredService<IOptions<MongoDBSettings>>().Value :> IMongoDBSettings)) |> ignore
            this

所以你需要将F#函数转换为System.Func(顺便还需要open System命名空间),注释参数的类型( )和使用运算符sp: IServiceProvider将​​结果向上转换为接口,因为F#没有隐式地进行这种转换。IMongoDBSettings:>


推荐阅读