3

私はコードをもっている:

using System.Linq.Expressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Expression<del> myET = x => x.Age; //for example in ASP.NET MVC forms
            Person.Name = "vitia"
            Person.Move();

        }
    }
}

Roslyn.NET を使用して、コードで使用されているすべてのメソッド、プロパティ、およびラムダを "プル" してコンソールに書き込む方法を知りたいです。今、私はこれに数時間座っていますが、何も考えられません。ここでMemberAccesExpressionSyntaxを使ってみたのですが、なかなか出てきません。そのようなことをしている例をいくつか示してもらえますか? このコードでは、画面にコンソールが表示されます。

x.エイジネームムーブ

4

1 に答える 1

2

これは、探している種類のクエリです。

var expressionNodes = syntaxTree.
    GetRoot().
    DescendantNodes().Where(n => n.Kind == SyntaxKind.[YourSyntaxKind]);

以下はコードの完全なサンプルです。C# コンソール アプリに貼り付けることができるはずです。

私は引き出しました:

  • 括弧で囲まれたラムダ
  • 単純なラムダ
  • メソッド

残りの必要なものを引き出すための演習として残します。

private static void StackOverflowTest()
{
    var syntaxTree = SyntaxTree.ParseText(@"
    using System.Linq.Expressions;

    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Expression<del> myET = x => x.Age; //for example in ASP.NET MVC forms
                Person.Name = ""vitia""
                Person.Move();

            }
        }
    }");

    EmitStatement(syntaxTree, SyntaxKind.ParenthesizedLambdaExpression);
    EmitStatement(syntaxTree, SyntaxKind.SimpleLambdaExpression);
    EmitStatement(syntaxTree, SyntaxKind.MethodDeclaration);
}

private static void EmitStatement(SyntaxTree syntaxTree, SyntaxKind sk)
{
    var expressionNodes = syntaxTree.
        GetRoot().
        DescendantNodes().Where(n => n.Kind == sk);

    foreach (var expressionNode in expressionNodes)
    {
        Console.WriteLine(expressionNode.ToString());
    }
}
于 2013-07-18T07:43:36.200 に答える