如何获取方法中使用的内部变量的名称
How to get the name of internal variables used in a method
如何(可能通过反射或 Roslyn API)获取 class 方法中使用的内部变量列表?
例如,在下面的代码中:
class C1{
private int var1;
public string var2;
void action1()
{
int var3;
var3=var1*var1;
var2="Completed";
}
}
我想获取 var3、var1 和 var2 作为 action1() 方法中使用的变量列表(作为名称和类型)。
其次,我需要确定上述哪些变量出现在表达式的左侧;即,它们的值已在此方法中修改。
我认为答案在于使用 Roslyn,但我不知道如何使用。谢谢!
如@xanatos 所述,无法从已编译的程序集中获取此信息。您应该使用 Roslyn 来完成此任务并有权访问源代码。这个答案解释了如何检索变量 and this article can be a good start Getting Started C# Semantic Analysis.
通过后面的文章,您可以得出以下代码:
using System;
using System.Linq;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
namespace Roslyn
{
internal class Program
{
private static void Main()
{
var tree = CSharpSyntaxTree.ParseText(@"
class C1{
private int var1;
public string var2;
void action1()
{
int var3;
var3=var1*var1;
var2=""Completed"";
}
}
");
var root = (CompilationUnitSyntax) tree.GetRoot();
var variableDeclarations = root.DescendantNodes().OfType<VariableDeclarationSyntax>();
Console.WriteLine("Declare variables:");
foreach (var variableDeclaration in variableDeclarations)
Console.WriteLine(variableDeclaration.Variables.First().Identifier.Value);
var variableAssignments = root.DescendantNodes().OfType<AssignmentExpressionSyntax>();
Console.WriteLine("Assign variables:");
foreach (var variableAssignment in variableAssignments)
Console.WriteLine($"Left: {variableAssignment.Left}, Right: {variableAssignment.Right}");
}
}
}
产生以下输出:
Declare variables:
var1
var2
var3
Assign variables:
Left: var3, Right: var1*var1
Left: var2, Right: "Completed"
确保安装 Microsoft.CodeAnalysis NuGet 包。
如何(可能通过反射或 Roslyn API)获取 class 方法中使用的内部变量列表?
例如,在下面的代码中:
class C1{
private int var1;
public string var2;
void action1()
{
int var3;
var3=var1*var1;
var2="Completed";
}
}
我想获取 var3、var1 和 var2 作为 action1() 方法中使用的变量列表(作为名称和类型)。
其次,我需要确定上述哪些变量出现在表达式的左侧;即,它们的值已在此方法中修改。
我认为答案在于使用 Roslyn,但我不知道如何使用。谢谢!
如@xanatos 所述,无法从已编译的程序集中获取此信息。您应该使用 Roslyn 来完成此任务并有权访问源代码。这个答案解释了如何检索变量 and this article can be a good start Getting Started C# Semantic Analysis.
通过后面的文章,您可以得出以下代码:
using System;
using System.Linq;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
namespace Roslyn
{
internal class Program
{
private static void Main()
{
var tree = CSharpSyntaxTree.ParseText(@"
class C1{
private int var1;
public string var2;
void action1()
{
int var3;
var3=var1*var1;
var2=""Completed"";
}
}
");
var root = (CompilationUnitSyntax) tree.GetRoot();
var variableDeclarations = root.DescendantNodes().OfType<VariableDeclarationSyntax>();
Console.WriteLine("Declare variables:");
foreach (var variableDeclaration in variableDeclarations)
Console.WriteLine(variableDeclaration.Variables.First().Identifier.Value);
var variableAssignments = root.DescendantNodes().OfType<AssignmentExpressionSyntax>();
Console.WriteLine("Assign variables:");
foreach (var variableAssignment in variableAssignments)
Console.WriteLine($"Left: {variableAssignment.Left}, Right: {variableAssignment.Right}");
}
}
}
产生以下输出:
Declare variables:
var1
var2
var3
Assign variables:
Left: var3, Right: var1*var1
Left: var2, Right: "Completed"
确保安装 Microsoft.CodeAnalysis NuGet 包。