如何在F#中创建Action <T>?

Yon*_*ahW 8 linq f# quotations

我正在使用Moq框架进行单元测试,并希望能够传递Action以记录void方法.

let log = new Mock<ILog>()
let quot = <@ fun (mock:ILog) -> mock.Info(It.IsAny<string>) @>  
let expr = (quot.ToLinqExpression() :?> Expression<Action<ILog>>)
log.Verify(expr)
Run Code Online (Sandbox Code Playgroud)

此代码失败,并显示以下错误:

System.InvalidCastException:无法将类型为'System.Linq.Expressions.MethodCallExpressionN'的对象强制转换为'System.Linq.Expressions.Expression 1[System.Action1 [log4net.ILog]]'.

我可以使用打印出来的类型

printfn "%s" (quot.Type.ToString())
Run Code Online (Sandbox Code Playgroud)

哪个输出

Microsoft.FSharp.Core.FSharpFunc`2 [log4net.ILog,Microsoft.FSharp.Core.Unit]

那么,我该如何创建一个Action呢?

Phi*_*ord 13

FQ 3完全支持LINQ表达式,因此您现在可以将Action作为lambda表达式传递给Moq :

let mock = Mock<ILog>()
mock.Verify(fun (log:ILog) -> log.Info(It.IsAny<string>()))
Run Code Online (Sandbox Code Playgroud)


Dan*_*iel 5

尝试:

let quot = <@ new Action<_>(fun (mock:ILog) -> mock.Info(It.IsAny<string>)) @>
Run Code Online (Sandbox Code Playgroud)