我有一个记录异常和任何记录的函数,这是异常的原因:
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.
可以使用匿名记录吗?
最佳答案
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" ]
关于f# - 是否可以使用匿名记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39732386/