Ответ 1
При вызове метода, который принимает любой делегат из Func
, вам не нужно явно создавать делегат, потому что F # неявно преобразует лямбда-выражения в тип делегирования (в вызовах членов). Я думаю, что просто вызов метода с лямбда-функцией должен работать (если это не так, вы можете поделиться сообщением об ошибке?)
Вот простой пример, демонстрирующий это:
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)
Обратите внимание, что вам нужен явный upcast (expr :> obj
), чтобы убедиться, что функция лямбда возвращает правильный тип (obj
). Если вы хотите присвоить лямбда-функцию локальному значению с помощью let
, то это не сработает, потому что неявное преобразование работает только тогда, когда оно передается как аргумент напрямую. Однако в этом случае код становится немного приятнее.