resolveTopDef,TopDefnApp,ResolveTopDefinition?

Jas*_*ban 1 f# quotations

@Tomasp有几个博客条目(这里是一个),它指的是一种使用[<ReflectedDefinition>]ResolveTopDefinition从方法中提取引用的方法,作为包装定义的替代方法<@ ... @>(或者是<@@ ... @@>吗?).

在任何情况下,我现在无法得到任何这些东西进行编译,我认为这些功能已经改变了 - 但我不知道在谷歌这些名称中发现的或者相关的唯一提及Tomas的博客和工作.

目前的方式是什么?

我已经看过Eval.TryGetReflectedDefinition,但这需要一个MethodBase,并且这种方法似乎不应该是必要的,除非我试图反思另一个/已编译的程序集.

谢谢!

Tom*_*cek 5

关于引用和反映的方法定义的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
Run Code Online (Sandbox Code Playgroud)

如果您正在进行大量的报价处理,那么open两者都可能是一个好主意Patterns并且DerivedPatterns使代码更短(但另一方面,"点"使得探索模块变得容易).

这里的关键是MethodWithReflectedDefinition哪个模式可以匹配任何模式MethodInfo(并且属性类似),并且当它是具有ReflectedDefinition属性的方法时返回其引用.您还可以将属性放在包含这些函数的模块上.