我已经在这个问题上挣扎了很长一段时间,似乎无法找到任何解决方案。让我为你简化一下。
我有一个我想要调用的泛型函数,但是我想用它作为实例调用它的类型参数。实施例
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而不是我的选择。
答案 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