5

cs ファイル内のすべてのメソッドの内容を文字列に取得する必要があります。私が探しているのは、csファイルの入力がある場合、メソッド名をキー、メソッド本体を値として辞書が返されることです。

正規表現とリフレクションを試しましたが成功しませんでした。

ありがとう

4

6 に答える 6

5

役に立つかどうかはわかりませんが、Visual Studio アドインには、VB および C# 言語パーサーへのフル アクセスを提供する EnvDTE オブジェクトが含まれています。コード モデルを使用したコードの検出を参照してください。

何年も前に少し触れましたが、使い方がどれほど難しいか、またはどれほど効果的かはわかりませんが、必要なものが得られるようです.

コード モデルにより、オートメーション クライアントは、クラス、インターフェイス、構造、メソッド、プロパティなど、プロジェクト内の高レベルの定義を検出するために、Visual Studio 言語のパーサーを実装することを回避できます。

記事全体を読むと、関数のファイルから全文を取得する方法が説明されています

お役に立てれば :)

于 2008-11-04T13:18:48.457 に答える
2

ファイルが有効である(つまりコンパイルされている)と仮定すると、ファイル全体を文字列に読み込むことから始めることができます。

私はあなたの質問から、あなたはメソッド名だけに興味があり、クラス名には興味がないということを集めました。次に、 public | protected | privateのすべてのインスタンス、オプションのキーワードvirtual / overrideなど、 MethodName、オプションのパラメーター、を提供する正規表現が必要です。コーディング規約があれば役立つので、すべてのメソッド定義は常に1行にあり、複数行にまたがっていないと想定できます。

それができたら、関数本体を取得するために{と}を数えるだけです。

そして最後のアドバイス:仮定に注意してください。彼らはお尻にあなたを噛むという厄介な習慣を持っています。

編集:痛い、コメントを忘れた!メソッド本体のコメントに角かっこが含まれていると、カウントがうまくいかない可能性があります。したがって、最初のステップとして、ソースからすべてのコメントを削除する必要があります。

于 2008-11-04T12:49:09.233 に答える
1

一般に、解決しようとしている問題は、コンパイラーと同じ方法でC#コードを解析し、コードを生成するのではなく、関数の内容を保存することです。したがって、ソリューションの背景として、c#文法とそれらを解析する方法を確認する必要があります。

StingyJackによると、これを行う簡単な方法は、関数定義のみを識別する正規表現を作成することです。次に、その間のすべてが関数本体であると想定できます。ただし、その仮定では、1つのファイル内の複数のクラスや、クラスの最後にある}のようなものは処理されません。このようなことを処理するには、ac#コンパイラを設計する必要があります。これは、完全なc#文法を処理することが、c#が関数であると考えるものを正しく識別する唯一のものであるためです。

于 2008-11-04T12:53:34.780 に答える
0

カスタムメイドのパーサーが最適なオプションになります。BlairがStingyJackへのコメントで述べたように、正規表現を使用してコードを解析することは非常に困難です。私は一度試しましたが、中括弧とNETのバランスをとることは可能ですが、コメントと文字列のエスケープははるかに複雑です。

パーサーは物事をはるかに単純にする必要があります。優れたジェネレーターについては、antlrを参照してください。

リフレクションに関しては、(必要なすべての依存関係がある限り)コードをコンパイルしてから、リフレクターのようなコンテンツにアクセスすることを試みることができると思います。しかし、私はパーサーを使います。

于 2008-11-04T12:47:07.943 に答える
0

NRefactory は、このジョブのツールです。ここを見てください:http://laputa.sharpdevelop.net/content/binary/NRefactory.wmv

于 2008-11-04T14:23:19.967 に答える
0

関数ヘッダーを見つけたら、関数の終わりが見つかるまで中かっこの数を数えます。

于 2008-11-04T12:39:07.960 に答える