在函数中访问已实现接口成员的值

Access values of implemented interface members in function

我有这个界面:

interface IHaveHeaders {
  Dictionary<string, object>? Headers { get; set; }
  void SetHeader(string key, object value);
  object? GetHeader(string key);
}

我试图在 F# 中实现它并在 SetHeaderGetHeader 函数中访问 Headers 字典,但我不知道如何访问 Headers 来自函数的成员:

type HeadersImpl =
  interface IHaveHeaders with
  member val Headers = Dictionary<string, obj>() with get, set
  member this.SetHeader (key, value) = () // how do I add a new `Headers` entry?
  member this.GetHeader (key) = null // how do I get an entry from `Headers`

由于 F# 不支持此答案的隐式向上转换,因此您需要显式向上转换为 this 上的接口类型。

type HeadersImpl =
  interface IHaveHeaders with
      member val Headers = Dictionary<string, obj>() with get, set
      member this.SetHeader (key, value) =
          let headers = (this :> IHaveHeaders).Headers
          headers.Add(key, value)
      member this.GetHeader (key) =
          let headers = (this :> IHaveHeaders).Headers
          headers.[key]

Philip 的回答一定能解决问题。另一种方法是不对 Headers 使用自动 属性,而是显式定义本地字段。这使您的 属性 定义更长一些,但它使访问代码更简单:

type HeadersImpl() =
  let mutable headers = Dictionary<string, obj>()
  interface IHaveHeaders with
    member this.Headers with get() = headers and set(v) = headers <- v
    member this.SetHeader (key, value) = headers.Add(key, value)
    member this.GetHeader (key) = headers.[key]