4

私はかなり長い間この問題に苦しんでいて、解決策を見つけることができないようです。簡単にしましょう。

呼び出したいジェネリック関数がありますが、インスタンスとしてのみ呼び出したいtype引数があります。例

let foo_a<'a> () = typeof<'a>
let foo_b (t : System.Type) = foo_a<t>() // of course this does not work

私は次のステートメントが真実であることを望みます

foo_a<int>() = foo_b(typeof<int>)

C#ではfoo_aのMethodInfoを反映してMakeGenericMethod(t)を実行しますが、F#でこれを行うにはどうすればよいですか?

明確にするために、依存関係を反転し、代わりにfoo_aがfoo_bを呼び出すようにすることは、私にとってオプションではありません。

4

1 に答える 1

3

@svickが言ったように、F#でこれを行う特別な方法はありません。C#の場合と同じようにReflectionを使用する必要があります。

F#インタラクティブに貼り付けることができる簡単な例を次に示します。

open System.Reflection

type Blah =
    //
    static member Foo<'T> () =
        let argType = typeof<'T>
        printfn "You called Foo with the type parameter: %s" argType.FullName


let callFoo (ty : System.Type) =
    let genericFoo =
        typeof<Blah>.GetMethod "Foo"

    let concreteFoo =
        genericFoo.MakeGenericMethod [| ty |]

    concreteFoo.Invoke (null, Array.empty);;  // The ;; is only needed for F# interactive

出力:

> callFoo typeof<int>;;
You called Foo with the type parameter: System.Int32
val it : obj = null
于 2013-02-03T14:30:34.130 に答える