1

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

无论如何,我现在无法编译任何这些东西,我认为这些功能已经改变 - 但我不知道我在谷歌上找到的这些名字的唯一提及是什么或相关Tomas 的博客和工作。

目前的方式是什么?

我见过 Eval.TryGetReflectedDefinition,但这需要 MethodBase,除非我试图反映另一个/已经编译的程序集,否则这种方法似乎不是必需的。

谢谢!

4

1 回答 1

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

open如果您要进行大量报价处理,那么缩短代码PatternsDerivedPatterns缩短代码可能是一个好主意(但另一方面,“点”使探索模块变得容易)。

这里的关键是MethodWithReflectedDefinition它是一种可以匹配任何模式MethodInfo(属性也有类似的模式)并且当它是具有ReflectedDefinition属性的方法时返回它的引号。您还可以将属性放在包含函数的模块上。

于 2014-09-21T20:42:39.633 回答