我正在使用需要类型为Func的值的api。 (具体来说,我正试着致电ModelMetadataProviders.Current.GetMetadataForType()。
如何在F#中构造该值?
答案 0 :(得分:19)
当调用接受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函数分配给本地值,则它将无法工作,因为隐式转换仅在直接作为参数传递时才起作用。但是,在这种情况下,它会使代码更好。
答案 1 :(得分:7)
您通常可以传入任何() -> obj
,它会自动转换为Func<obj>
。您可能需要使用fun
Func<obj>
> let d : Func<obj> = Func<obj>(fun () -> box "hello");;
val d : Func<obj>
答案 2 :(得分:0)
let f = new System.Func<obj>(fun() -> printfn "ok"; new obj())