2016-12-08 8 views
4

オブジェクトを返す関数の結果をどのように取ってF#の区別されたユニオンにキャストしますか?F#で差別化されたユニオン上のマッチを折りたたむ方法

問題シナリオでは、私はセレンのwebdriverでjavascript executorを使って作業しています。ドキュメントは、出力がcertianタイプまたはタイプのリストのオブジェクトであることを指定します。 (Ref https://www.w3.org/TR/webdriver/#executing-script

私は、返されたオブジェクトに、識別されたユニオンにキャストすることによっていくつかの構造体を与えて、後でそれにマッチさせることができます。

キャストは直接動作しません。キャストはコンストラクタを持つことができません。そのため、キャストすることはできません。これについて正しい方法は何ですか?

type JsResult = 
    | E of IWebElement 
    | I of Int64 
    | B of bool 
    | S of String 
    | LE of IWebElement list 
    | LI of Int64 list 
    | LB of bool list 
    | LS of String list 
    | N of Object 
    override self.ToString() = 
     match self with 
     | E e -> e.Text 
     | I i -> i.ToString() 
     | B b -> b.ToString() 
     | S s -> s 
     | LE le -> String.concat " " (le |> Seq.map(fun x-> x.Text)) 
     | LI li -> String.concat " " (li |> Seq.map(fun x-> x.ToString())) 
     | LB lb -> String.concat " " (lb |> Seq.map(fun x-> x.ToString())) 
     | LS ls -> String.concat " " ls 
     | N _ -> String.Empty 

let execute script : JsResult = (browser :?> IJavaScriptExecutor).ExecuteScript(script) :> JsResult 

答えて

6

スタティックファクトリメソッドを作成することはできますか?これを試してください:

type JsResult = 

    // ... 

    with static member ofObject o = 
     match box o with 
     | :? IWebElement as e -> E e 
     | :? Int64 as i -> I i 
     | :? bool as b -> B b 
     | :? String as s -> S s 
     | :? (IWebElement list) as le -> LE le 
     | :? (Int64 list) as li -> LI li 
     | :? (bool list) as lb -> LB lb 
     | :? (String list) as ls -> LS ls 
     | :? Object as n -> N o 
     | _ -> failwith "No wrapper available for type" 


let execute script : JsResult = (browser :?> IJavaScriptExecutor).ExecuteScript(script) |> JsResult.ofObject 

(指定された型のいずれかがint型やbool型のいずれかである場合、ボクシングは必要です)。

関連する問題