当存在同名 属性 时如何调用扩展方法?
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()
我正在尝试使用 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()