统计记录类型的成员

Tim*_*imo 4 f#

假设我有以下类型:

type BinaryOp =
    { Lhs: int
      Rhs: int
      Destination: int }
Run Code Online (Sandbox Code Playgroud)

是否有 F# 方法来计算该记录的成员,即countMembers<BinaryOp> = 3?我知道我可以使用,System.Reflection但我宁愿不使用。

Tom*_*cek 5

我认为不依赖 .NET 反射机制就没有办法做到这一点。但是,核心 F# 库在 .NET 反射之上提供了一个方便的 API,用于处理 F# 类型。您可以countMembers使用 F# 反射 API 实现,如下所示:

open Microsoft.FSharp.Reflection

let countMembers<'T> = 
  FSharpType.GetRecordFields(typeof<'T>).Length
Run Code Online (Sandbox Code Playgroud)

我不确定您为什么要这样做,或者为什么要避免反射 - 也许对于您实际想要实现的目标有完全不同的设计 - 但是如果您需要计算记录中的字段数,这是最好的方法。

  • @Timo - 嗯,你的用例对我来说听起来完全合理!我认为没有更好的方法可以做到这一点,并且我可以看到在编译时执行此操作是如何有意义的。(虽然如果 F# 有一种机制可以让您在编译时执行此操作,那么它可能需要相当复杂,引入另一个可能出现故障的区域,所以我觉得这里的反映还不错!) (2认同)