2013-02-03 55 views
3

的實例的泛型函數我已經在這個問題上掙扎了很長一段時間了,似乎無法找到任何解決方案。讓我爲你簡化它。調用類型爲

我有一個通用的函數,我想調用,但我想調用它的類型參數只作爲一個實例。例如

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

我想我會一直體現出foo_a的MethodInfo的和做MakeGenericMethod(T)下面的語句是真實的

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

在C#中,但我要如何做到這一點在F#?

只是爲了清除,翻轉依賴並使foo_a調用foo_b而不是我的選項。

+1

反映在F#工作它在C#中以同樣的方式。你嘗試過使用它嗎? – svick

回答

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 
+0

謝謝。我的問題是通過將我的代碼放入一個類的靜態成員內部以及對該類的反射來解決的,如示例中所示。 需要有人在我的箱子外面思考。 :) –

+0

有沒有一種解決方案可以工作,只能從函數值開始,而不是類型+名稱? – Nuzzolilo

相關問題