当存在同名 属性 时如何调用扩展方法?

How to call extension method when there is a property with same name?

我正在尝试使用 OwaspHeaders.Core nuget 包,但我不知道如何在 F# 中使用他们的流畅风格配置生成器。以下是从他们的文档中转换为 F# 的 C# 代码(并进行了一些简化)。

#r "nuget: OwaspHeaders.Core, 4.2.0"
open OwaspHeaders.Core.Extensions

let config =
    SecureHeadersMiddlewareBuilder
        .CreateBuilder()
        .UseHsts(1200, false)
        .Build()

问题是 CreateBuilder returns 的对象也有 UseHsts 属性,无论我尝试什么都解决了这个问题导致错误。

FS0003: This value is not a function and cannot be applied.

如何调用 UseHsts 扩展方法,而不是访问具有相同名称的 属性?

一种方法是直接调用UseHsts方法

let config =
    SecureHeadersMiddlewareBuilder
        .UseHsts(SecureHeadersMiddlewareBuilder.CreateBuilder(), 1200, false)
        .Build()

根据@nilekirk 的回答,您可以创建自己的具有不同名称的扩展方法,以保持流畅的语法:

#r "nuget: OwaspHeaders.Core, 4.2.0"
open OwaspHeaders.Core.Extensions
open OwaspHeaders.Core.Models

type SecureHeadersMiddlewareConfiguration with
    member config.MyUseHsts(maxAge, includeSubDomains) =
        SecureHeadersMiddlewareBuilder.UseHsts(config, maxAge, includeSubDomains)

let config =
    SecureHeadersMiddlewareBuilder
        .CreateBuilder()
        .MyUseHsts(1200, false)
        .Build()

如果您想保持相同的默认参数,我认为您可能必须改为执行以下操作:

type SecureHeadersMiddlewareConfiguration with
    member config.MyUseHsts(?maxAge, ?includeSubDomains) =
        match maxAge, includeSubDomains with
            | Some maxAge', Some includeSubDomains' ->
                SecureHeadersMiddlewareBuilder.UseHsts(config, maxAge', includeSubDomains')
            | Some maxAge', None ->
                SecureHeadersMiddlewareBuilder.UseHsts(config, maxAge')
            | None, Some includeSubDomains' ->
                SecureHeadersMiddlewareBuilder.UseHsts(config, includeSubDomains = includeSubDomains')
            | None, None ->
                SecureHeadersMiddlewareBuilder.UseHsts(config)

它有点难看,但它会让您的其余代码变得更好。

以上两个都是很好的答案,另一种方法是使用类型别名,它可以使您的代码简短流畅,也可以处理所有默认参数。

#r "nuget: OwaspHeaders.Core, 4.2.0"
open OwaspHeaders.Core.Extensions

type SHMB = SecureHeadersMiddlewareBuilder

let config = SHMB.UseHsts(SHMB.CreateBuilder(),1200,false).Build()