F #

2016-12-08 1 views
4

에있는 차별화 된 유니온에서 일치 항목을 축소하는 방법 개체를 반환하는 함수의 결과를 어떻게 가져 와서 F #의 차별화 된 유니버스로 캐스팅합니까?F #

문제 시나리오, 셀레늄의 webdriver에서 자바 스크립트 실행 프로그램을 사용하고 있습니다. 문서는 출력이 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 인 경우에만 복싱이 필요합니다.)