在F#中,如何生成类型为Func <obj>?</obj>的表达式

时间:2010-07-13 14:53:58

标签: f# c#-to-f#

我正在使用需要类型为Func的值的api。 (具体来说,我正试着致电ModelMetadataProviders.Current.GetMetadataForType()

如何在F#中构造该值?

3 个答案:

答案 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())