gpt4 book ai didi

c# - 使用 Roslyn 查找对方法的所有引用

转载 作者:IT王子 更新时间:2023-10-29 04:46:34 25 4
gpt4 key购买 nike

我正在寻找扫描一组 .cs 文件以查看哪些调用了 Value Nullable<T> 的属性(查找所有引用资料)。例如,这将匹配:

class Program
{
static void Main()
{
int? nullable = 123;
int value = nullable.Value;
}
}

我了解了 Roslyn 并查看了一些示例,但其中许多已经过时并且 API 庞大。我该怎么做呢?

我在解析语法树后卡住了。这是我目前所拥有的:

public static void Analyze(string sourceCode)
{
var tree = CSharpSyntaxTree.ParseText(sourceCode);

tree./* ??? What goes here? */
}

最佳答案

您可能正在寻找 SymbolFinder类,特别是 FindAllReferences方法。

听起来您在熟悉 Roslyn 时遇到了一些困难。我有一系列博客文章可以帮助人们了解 Roslyn,称为 Learn Roslyn Now .

正如@SLaks 提到的,您将需要访问我在 Part 7: Introduction to the Semantic Model 中介绍的语义模型

这是一个向您展示如何使用 API 的示例。如果可以,我会使用 MSBuildWorkspace 并从磁盘加载项目,而不是像这样在 AdHocWorkspace 中创建项目。

var mscorlib = PortableExecutableReference.CreateFromAssembly(typeof(object).Assembly);
var ws = new AdhocWorkspace();
//Create new solution
var solId = SolutionId.CreateNewId();
var solutionInfo = SolutionInfo.Create(solId, VersionStamp.Create());
//Create new project
var project = ws.AddProject("Sample", "C#");
project = project.AddMetadataReference(mscorlib);
//Add project to workspace
ws.TryApplyChanges(project.Solution);
string text = @"
class C
{
void M()
{
M();
M();
}
}";
var sourceText = SourceText.From(text);
//Create new document
var doc = ws.AddDocument(project.Id, "NewDoc", sourceText);
//Get the semantic model
var model = doc.GetSemanticModelAsync().Result;
//Get the syntax node for the first invocation to M()
var methodInvocation = doc.GetSyntaxRootAsync().Result.DescendantNodes().OfType<InvocationExpressionSyntax>().First();
var methodSymbol = model.GetSymbolInfo(methodInvocation).Symbol;
//Finds all references to M()
var referencesToM = SymbolFinder.FindReferencesAsync(methodSymbol, doc.Project.Solution).Result;

关于c# - 使用 Roslyn 查找对方法的所有引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31861762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com