使用类型实例调用泛型函数

时间:2013-02-03 13:42:26

标签: generics f#

我已经在这个问题上挣扎了很长一段时间,似乎无法找到任何解决方案。让我为你简化一下。

我有一个我想要调用的泛型函数,但是我想用它作为实例调用它的类型参数。实施例

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而不是我的选择。

1 个答案:

答案 0 :(得分:3)

正如@svick所说,在F#中没有特别的方法可以做到这一点 - 你需要像在C#中那样使用Reflection。

这是一个可以粘贴到F#interactive中的简单示例:

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