0

私はそれを返そうとしstatically typeています(正確には一意のアイテムのみ)。record fieldfield

したがって、次のようになります。

type Item = {Id:int; Name:string}
  with
    member this.field fieldName =
      let info = getInfo fieldName
      this 
      |> Seq.map (fun record -> FSharpValue.GetRecordField info)
      |> Seq.distinct |> Seq.sort |> Array.ofSeq

let item = {Id = 1; Name = "First"}
let ids = item.field Item.Id

Tomas Petricek によるこの件名の古い記事を見つけましたがF# 3.0VB.

4

2 に答える 2

4

この場合、リフレクションや動的ルックアップを使用する必要はありません。レコードのフィールドを返す関数を使用して「ルックアップ」を表すと、非常にうまく機能します。System.FuncF# 関数型ではなく使用すると、すべての .NET 言語から適切に使用できるようになります。

type Item = 
  {Id:int; Name:string}

type ItemList =
  { Items : Item list }
  member this.Field(fn:System.Func<Item, 'T>) =
    this.Items
    |> Seq.map fn.Invoke
    |> Seq.distinct |> Seq.sort |> Array.ofSeq

let items = 
  { Items = [ {Id = 1; Name = "First"}
              {Id = 2; Name = "First"}
              {Id = 3; Name = "Second"} ] }

let names = items.Field(fun r -> r.Name)
于 2013-09-27T00:38:44.843 に答える