我正在使用一個需要類型爲Func的值的api。 (具體而言,我想打電話給ModelMetadataProviders.Current.GetMetadataForType()。在F#中,如何生成一個Func類型爲<obj>的表達式?
我如何構建F#價值?
我正在使用一個需要類型爲Func的值的api。 (具體而言,我想打電話給ModelMetadataProviders.Current.GetMetadataForType()。在F#中,如何生成一個Func類型爲<obj>的表達式?
我如何構建F#價值?
調用時,是以Func
的任何代表你不應該需要明確創建的方法委託,因爲F#隱含地將lambda表達式轉換爲委託類型(在成員調用中)。我認爲這只是打電話與lambda函數的方法應該工作
下面是一個簡單的例子說明了這一點(如果沒有,你可以分享錯誤消息?):
type Foo() =
member x.Bar(a:System.Func<obj>) = a.Invoke()
let f = Foo()
let rnd = f.Bar(fun() -> new Random() :> obj)
你的情況我想,這樣的事情應該工作:
m.GetMetadataForType((fun() -> <expression> :> obj), modelType)
請注意,你需要明確的向上轉型(expr :> obj
),以確保lambda函數返回正確的類型(obj
)。如果要使用let
將lambda函數分配給本地值,那麼它將不起作用,因爲隱式轉換僅在直接作爲參數傳遞時才起作用。但是,在這種情況下,它使代碼更好一些。
let f = new System.Func<obj>(fun() -> printfn "ok"; new obj())
我也可以省略'new'關鍵字。 – 2010-07-13 15:10:05
可以正常通過任何() -> obj
,它會自動轉換爲Func<obj>
。您可能需要來包裝你fun
與Func<obj>
:
> let d : Func<obj> = Func<obj>(fun() -> box "hello");;
val d : Func<obj>
我想你的例子中有一個錯字,因爲'Bar'需要一個'Func',但是你傳遞了一個隱含的'Func '。 –
kvb
2010-07-13 16:40:57
@kvb:你是對的,修正了錯字,謝謝! – 2010-07-13 16:43:15
你是對的。感謝Tomas。就我而言,我甚至不需要演員。 我原來的問題是,我這樣做: let acc =(fun() - > model) let meta = m.GetMetadataForType(acc,t) 不轉換,切換到: let meta = m .GetMetadataForType((fun() - > model),t) 工作正常。 – 2010-07-15 14:26:24