5

メソッド名、プロパティ名、フィールド名を一致させたい(クラスファイルから選択)。

これはクラスの例です:

class Perl
{
    string _name;
    public string Name { get; set; }
    public Perl()
    {
    // Assign this._name
    this._name = "Perl";
    // Assign _name
    _name = "Sam";

    // The two forms reference the same field.
    Console.WriteLine(this._name);
    Console.WriteLine(_name);
    }
    public static string doSomething(string test)
    {
        bla test;
    }
}

メソッドのコードを取得しました:

(?:public|private|protected)([\s\w]*)\s+(\w+)\s*\(\s*(?:\w+\s+(\w+)\s*,?\s*)+\)

そして、私は質問を得ました:

  • 上記の正規表現コードはすべてのメソッドを取得し、かなりうまく機能しますが、メソッド名を選択したいのですが、パラメーターとアクセサーは使用しません。したがって、私のコードを使用したexaplmceクラスからの結果は、 public Perl()およびpublic static doSomething(string test)になりますが、そのような結果が必要です: Perl()およびdoSomething()。だから - 私のコードはうまくマッチしますが、前の文で書いたように結果を表示したいです。
  • プロパティの選択方法 結果が表示されます: タイプとプロパティ名。したがって、例のクラスの結果は次のようになります: string Name
  • 結果でフィールドを選択する方法: field_name と入力します。その場合は次のようになります: string _name
4

4 に答える 4

3

これを使ってRegex

メソッド用

(?:public\s|private\s|protected\s|internal\s)?[\s\w]*\s+(?<methodName>\w+)\s*\(\s*(?:(ref\s|/in\s|out\s)?\s*(?<parameterType>\w+)\s+(?<parameter>\w+)\s*,?\s*)+\)

methodNameandparameterTypeおよびという名前のグループを取得しparameterます。

フィールドの場合:

(?:public\s|private\s|protected\s)\s*(?:readonly\s+)?(?<type>\w+)\s+(?<name>\w+)

typeおよびという名前のグループを取得しnameます。

たとえば、メソッドのコードは次のようになります。

var inputString0 = "public void test(string name, out int value)\r\nvoid test(string name, int value)";
foreach (Match match in Regex.Matches(inputString0, @"(?:public\s|private\s|protected\s)?[\s\w]*\s+(?<methodName>\w+)\s*\(\s*(?:(ref\s|/in\s|out\s)?\s*(?<parameterType>[\w\?\[\]]+)\s+(?<parameter>\w+)\s*,?\s*)+\)"))
{
    var methodName = match.Groups["methodName"].Value;
    var typeParameterPair = new Dictionary<string, string>();
    int i = 0;
    foreach (var capture in match.Groups["parameterType"].Captures)
    {
        typeParameterPair.Add(match.Groups["parameterType"].Captures[i].Value, match.Groups["parameter"].Captures[i].Value);
        i++;
    }
}

コードプレックスIrony - .NET Language Implementation Kitも使用できます。

于 2012-08-11T12:02:32.187 に答える
2

回答へのコメントに記載されているように、より信頼性の高い方法は、.cs ファイルをコンパイルしてから、リフレクションを使用して、関心のあるメンバーの型を調べることです。次のことが含まれます。

  1. C# コンパイラ (csc.exe) を使用してファイルをコンパイルします。MSDN には、役に立つ例とヒントが含まれています。これは手動で行うことも、すべてを自動化する場合は、プログラムで csc.exe をProcessclassで実行することもできます。
  2. Assembly.LoadFile()メソッドを使用して、結果のアセンブリを読み込みます。
  3. リフレクションを使用して、アセンブリから型を取得し、問い合わせることができるようになりました。

編集: csc.exe の代わりに、CodeDOM を使用できます必要なものがすべて含まれている例があります。

于 2012-08-11T14:43:06.800 に答える
0

Microsoft.VisualStudio.CSharp.Services.Language名前空間やその他のVisualStudioExtensibility機能を確認することをお勧めします。これにより、コンパイルする必要がなくなります。

于 2012-08-12T06:53:03.917 に答える
0

C# などの言語は、正規表現のみを使用して解析するには、ステートメント構文のバリエーションが多すぎます。正規表現に加えて、文脈文法パーサーが必要です。

Roslynを試してみます。これは、コードから内部にアクセスできる C# コンパイラです。Roslyn にコードの解析を依頼し、必要な情報についてクエリを実行します。

于 2012-08-12T06:28:20.060 に答える