我有一个记录异常和任何记录的函数,这是异常的原因:
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.
是否可以使用匿名记录?
答案 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" ]