围绕引用和反射方法定义的 API 已经发生了很大的变化(我在很早的时候就写了一些博客文章),所以这是我博客中最过时的部分。对于那个很抱歉!
无论如何,下面的简单片段演示了当前的 API:
[<ReflectedDefinition>]
let foo a b = a + b
open Microsoft.FSharp.Quotations
match <@@ foo 1 2 @@> with
// Matches a call to a static method that is marked as `ReflectedDefinition`
| Patterns.Call(None, DerivedPatterns.MethodWithReflectedDefinition body, args) ->
// Return the actual quotation - simply call the body that represents
// the function with all the arguments as arguments.
Expr.Applications(body, args |> List.map (fun a -> [a]))
| e -> e
open
如果您要进行大量报价处理,那么缩短代码Patterns
并DerivedPatterns
缩短代码可能是一个好主意(但另一方面,“点”使探索模块变得容易)。
这里的关键是MethodWithReflectedDefinition
它是一种可以匹配任何模式MethodInfo
(属性也有类似的模式)并且当它是具有ReflectedDefinition
属性的方法时返回它的引号。您还可以将属性放在包含函数的模块上。