我有一个代码:
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/