al llamar a un método que toma cualquier delegado de la Func
que no es necesario para crear de forma explícita el delegado, porque F # convierte implícitamente expresiones lambda para delegar el tipo (en llamadas a miembros). Creo que simplemente llamando al método con función lambda debe trabajar
Aquí está un ejemplo simple que muestra esto (si no es así, ¿podría compartir el mensaje de error?):
type Foo() =
member x.Bar(a:System.Func<obj>) = a.Invoke()
let f = Foo()
let rnd = f.Bar(fun() -> new Random() :> obj)
En su caso , supongo que algo como esto debería funcionar:
m.GetMetadataForType((fun() -> <expression> :> obj), modelType)
en cuenta que necesita upcast explícita (expr :> obj
), para asegurarse de que la función lambda devuelve el tipo correcto (obj
). Si desea asignar la función lambda a un valor local usando let
, entonces no funcionará, porque la conversión implícita solo funciona cuando se pasa como un argumento directamente. Sin embargo, en ese caso, hace que el código sea un poco más agradable.
Creo que hay un error ortográfico en su ejemplo, ya que 'Bar' toma' Func 'pero está pasando un' Func 'implícito'. –
kvb
@kvb: tienes razón, corrigió el error tipográfico, ¡gracias! –
Tiene razón. Gracias Tomás. En mi caso, ni siquiera necesitaba el elenco. Mi problema original fue que hice esto: let acc = (fun() -> model) let meta = m.GetMetadataForType (acc, t) que no convierte, cambiando a esto: let meta = m .GetMetadataForType ((fun() -> model), t) funcionó bien. –