我正在与一些C#库进行一些接口,需要进行一些对象的转换。我认为可以通过将downcast的类型作为参数传递来解决一些代码重复。
// transform exceptions into Option type
let tryFn fn =
try Some(fn()) with ex -> None
let tryCastString (o: obj) = tryFn (fun () -> o :?> string)
let tryCastUInt64 (o: obj) = tryFn (fun () -> o :?> uint64)
// I would like to do something like the following
let tryCast (o: obj) (t: type) = tryFn (fun () -> o :?> t)
答案 0 :(得分:8)
使用类型参数:
let tryCast<'R> (o: obj) = tryFn (fun () -> o :?> 'R)
这有一个额外的好处,在很多情况下,类型推断可以为你推断出这种类型,这里只是一个简单的例子:
let x: int64 option = tryCast "4"
此处您不需要指定类型,因为编译器已知x
类型为option<int64>
。