F# 的 C# 公共成员初始值设定项是否有任何替代方案?

Joh*_*ing 2 f# c#-to-f#

在 C# 中,可以分配公共成员来代替构造函数调用:

options.TokenValidationParameters = new TokenValidationParameters { NameClaimType = "preferred_username" }
Run Code Online (Sandbox Code Playgroud)

为了达到同样的效果,我编写了以下 F# 代码:

options.TokenValidationParameters <- (new TokenValidationParameters()) |> fun it -> (it.NameClaimType <- "preferred_username"; it)
Run Code Online (Sandbox Code Playgroud)

然而它看起来一点也不好看。

有没有更好的方法来做到这一点?apply理想的解决方案可能是像kotlin 中那样的函数?

任何帮助表示赞赏。

Tom*_*cek 7

正如评论中提到的,您可以使用对象初始化语法指定参数:

options.TokenValidationParameters <- 
  new TokenValidationParameters( NameClaimType = "preferred_username")
Run Code Online (Sandbox Code Playgroud)

以上绝对是做到这一点的最佳方法。但即使您需要更复杂的逻辑,也没有必要使用笨拙的管道和fun构造在一行上构造对象。仅仅定义一个局部变量并没有什么问题:

let tokParams = new TokenValidationParameters()
tokParams.NameClaimType <- "preferred_username"
options.TokenValidationParameters <- tokParams
Run Code Online (Sandbox Code Playgroud)

如果你想限制变量的范围tokParams,你可以这样做:

options.TokenValidationParameters <- 
  let tokParams = new TokenValidationParameters()
  tokParams.NameClaimType <- "preferred_username"
  tokParams
Run Code Online (Sandbox Code Playgroud)

这也有效,因为 F# 块被视为表达式。在这种特殊情况下,您不需要这样做,但了解一下可能会有好处 - 它可以让您避免尴尬的管道。