簡體   English   中英

如何使用 Activator.CreateInstance 創建 F# 選項類型的實例?

[英]How do I create an instance of an F# option type using Activator.CreateInstance?

我可以創建一個函數來創建基於任何類型的選項類型:

let createOptionType typeParam =
    typeof<unit option>.GetGenericTypeDefinition().MakeGenericType([| typeParam |])

...我可以確認該功能有效:

createOptionType (typeof<int>) = (Some 5).GetType() // returns true

...我可以通過這樣做來創建值“Some 0”:

System.Activator.CreateInstance(x.GetType(), [| null |]) // returns Some 0

但是,我不知道如何創建任何其他“Some x”值,或者如何創建“None”。 (它似乎創建了“Some”,因為對於字符串,它是“Some null”。)

let makeOptionValue typey v isSome =
    let optionType = createOptionType typey
    let cases = FSharp.Reflection.FSharpType.GetUnionCases(optionType)
    let cases = cases |> Array.partition (fun x -> x.Name = "Some")
    let someCase = fst cases |> Array.exactlyOne
    let noneCase = snd cases |> Array.exactlyOne
    let relevantCase, args =
        match isSome with
        | true -> someCase, [| v |]
        | false -> noneCase, [| |]
    FSharp.Reflection.FSharpValue.MakeUnion(relevantCase, args)

例子:

makeOptionValue typeof<int> 3 true          // returns "Some true"
makeOptionValue typeof<int> null false      // returns "None"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM