1

@Tomasp には、定義をラップする代わりにメソッドから引用を使用および抽出する方法を参照するいくつかのブログ エントリ (ここに 1 つ) があります(またはそれは?)。[<ReflectedDefinition>]ResolveTopDefinition<@ ... @><@@ ... @@>

いずれにせよ、私はこれらのものを今コンパイルすることができず、機能が変更されたと思います-しかし、私はこれらの名前についてGoogleで見つけた言及が何であるか、または関連していることをほとんど知りませんトーマスのブログと作品へ。

現在の方法は何ですか?

私は 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 に答える