2017-01-06 5 views
2

Ich mache einige Schnittstellen mit einigen C# -Bibliotheken und muss einige Objekte werfen. Es gibt einige Doppelungen von Code, von denen ich denke, dass sie dadurch gelöst werden könnten, dass der Typ des Downcast als Argument übergeben werden kann.F # bieten Downcast-Typ als Funktionsargument

// 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) 

Antwort

8

eine Art Argument verwenden:

let tryCast<'R> (o: obj) = tryFn (fun() -> o :?> 'R) 

Dies hat den zusätzlichen Vorteil, dass Typinferenz diese Art für Sie in vielen Fällen ableiten lassen kann, ist hier ein einfaches Beispiel:

let x: int64 option = tryCast "4" 

Hier müssen Sie den Typ nicht angeben, da dem Compiler bekannt ist, dass x vom Typ option<int64> ist.

Verwandte Themen