我正在使用需要类型为Func的值的api.(具体来说,我正在尝试调用ModelMetadataProviders.Current.GetMetadataForType().
如何在F#中构造该值?
Tom*_*cek 20
当调用接受任何委托的方法时,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)
Run Code Online (Sandbox Code Playgroud)
在你的情况下,我认为这样的事情应该有效:
m.GetMetadataForType((fun () -> <expression> :> obj), modelType)
Run Code Online (Sandbox Code Playgroud)
请注意,您需要显式upcast(expr :> obj),以确保lambda函数返回正确的类型(obj).如果要使用lambda函数将lambda函数赋值给本地值let,则它将无效,因为隐式转换仅在直接作为参数传递时才起作用.但是,在这种情况下,它使代码更好一些.
您通常可以传入任何内容() -> obj,它将自动转换为Func<obj>.您可能需要来包装你fun有Func<obj>:
> let d : Func<obj> = Func<obj>(fun () -> box "hello");;
val d : Func<obj>
Run Code Online (Sandbox Code Playgroud)