I'm working with an api that requires a value of type Func. (Specifically, I'm trying to call ModelMetadataProviders.Current.GetMetadataForType() .
How can I construct that value in F#?
When calling a method that takes any delegate of the Func
you shouldn't need to explicitly create the delegate, because F# implicitly converts lambda expressions to delegate type (in member calls). I think that just calling the method with lambda function should work (if it doesn't, could you share the error message?)
Here is a simple example that demonstrates this:
type Foo() =
member x.Bar(a:System.Func<obj>) = a.Invoke()
let f = Foo()
let rnd = f.Bar(fun () -> new Random() :> obj)
In your case, I suppose something like this should work:
m.GetMetadataForType((fun () -> <expression> :> obj), modelType)
Note that you need explicit upcast ( expr :> obj
), to make sure the lambda function returns the right type ( obj
). If you want to assign the lambda function to a local value using let
, then it won't work, because implicit conversion works only when it is passed as an argument directly. However, in that case, it makes the code a bit nicer.
You can normally pass in any () -> obj
and it will be automatically converted to Func<obj>
. You may need to wrap your fun
with Func<obj>
:
> let d : Func<obj> = Func<obj>(fun () -> box "hello");;
val d : Func<obj>
let f = new System.Func<obj>(fun() -> printfn "ok"; new obj())
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.