c# - 代码中使用的属性、方法、lambda 表达式

标签 c# roslyn

我有一个代码:

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 并将其写入控制台。现在我坐在这上面好几个小时,我想不出任何东西。我尝试在这里使用 MemberAccessExpressionSyntax,但我并没有真正使用它。你能展示一些做类似事情的例子吗?使用此代码,屏幕将放置控制台:

x.Age Name Move

最佳答案

这就是您正在寻找的查询类型:

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());
    }
}

关于c# - 代码中使用的属性、方法、lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17427247/

相关文章:

c# - 提交表单时获取查询字符串值...MVC3

c# - 去年总天数

c# - 检查 ITypeSymbol 是否是委托(delegate)类型

c# - Roslyn ObjectPool 结构包装器

c# - 将数据从一个对象复制到另一个具有有限属性的对象

c# - RabbitMQ 连接错误 "None of the specified endpoints were reachable"

c# - 我如何才能在罗斯林返回?

c# - 针对网络标准 1.6 的 .net 核心应用程序中的动态引用?

c# - 通过 Roslyn 添加元数据引用时,将完整路径添加到项目文件中

c# - 被操作系统删除后如何检查路径是文件还是目录?