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 可以“拉”并将代码中使用的所有方法、属性和 lambda 写入控制台。现在我坐在这个上面好几个小时,我什么都想不出来。我尝试在这里使用 MemberAccesExpressionSyntax,但我并没有真正出来。你能举一些这样的例子吗?使用此代码,屏幕将显示控制台:

x.年龄名称移动

4

1 回答 1

2

这是您要查找的查询类型:

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

以下是完整的代码示例。您应该能够将其粘贴到您的 C# 控制台应用程序中。

我抽出来了:

  • 亲子化的 Lambda
  • 简单的 Lambda
  • 方法

我会离开作为一个练习,让你自己拿出你需要的其余部分。

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 回答