是否可以使用匿名记录

时间:2016-09-27 18:59:51

标签: f#

我有一个记录异常和任何记录的函数,这是异常的原因:

let logExceptionWithObject(exn: exn) (obj: Object) =
    try
        delimiter()

        FSharpType.GetRecordFields (obj.GetType())
        |> Array.iter (fun f -> 
                        logger.Error(f.Name + " " + f.GetValue(obj).ToString())
                      )  

        logger.Error(exn.Message)
        logger.Verbose("{@Exn}", exn)
    with
        | exn -> Console.WriteLine(exn.Message)

我可以使用我为其创建的任何记录来调用此函数。但有时我需要用记录调用这个函数我没有类型声明:

logExceptionWithObject exn { A = 10; B = 20; C = "some" }

我不想为每个记录声明类型,但是编译器给我发错误:

The record label 'A' is not defined.

是否可以使用匿名记录?

1 个答案:

答案 0 :(得分:8)

F#没有匿名记录。但是在你的例子中,你无论如何都不需要它们,因为你只是将它们用作词典,为什么不使用真正的词典呢?

但是等等,你甚至不需要一本字典 - 所有你需要的只是一个键/值对的列表,就是它。

let logExceptionWithObject(exn: exn) map =
    try
        delimiter()
        map |> Seq.iter ( fun (k, v) -> sprintf "%s %s" k v |> logger.Error )
        logger.Error(exn.Message)
        logger.Verbose("{@Exn}", exn)
    with
        | exn -> Console.WriteLine(exn.Message)

用法:

logExceptionWithObject exn [ "A","10" ; "B","20" ; "C","some" ]