gpt4 book ai didi

c# - Roslyn 在 ObjectCreationExpressionSyntax 中获取 IdentifierName

转载 作者:行者123 更新时间:2023-12-05 02:19:00 29 4
gpt4 key购买 nike

目前,我正在使用 roslyn 进行简单的 C# 代码分析。我需要在一个解决方案中解析所有项目的所有文档,并在该文档中获取声明的使用类。

例如来自:

class Program
{
static void Main(string[] args)
{
var foo = new Foo();
}
}

我想让程序使用Foo

我已经解析了所有文档并在其中获取了声明的类。

// all projects in solution
foreach (var project in _solution.Projects)
{
// all documents inside project
foreach (var document in project.Documents)
{
var syntaxRoot = await document.GetSyntaxRootAsync();
var model = await document.GetSemanticModelAsync();
var classes = syntaxRoot.DescendantNodes().OfType<ClassDeclarationSyntax>();
// all classes inside document
foreach (var classDeclarationSyntax in classes)
{
var symbol = model.GetDeclaredSymbol(classDeclarationSyntax);
var objectCreationExpressionSyntaxs = classDeclarationSyntax.DescendantNodes().OfType<ObjectCreationExpressionSyntax>();
// all object creations inside document
foreach (var objectCreationExpressionSyntax in objectCreationExpressionSyntaxs)
{
// TODO: Get the identifier value
}
}
}
}

问题是获取 IdentifierName Foo。使用 debugger ,我看到 objectCreationExpressionSyntax.Type 得到了 Identifier.Text 得到了我需要的值,但是 objectCreationExpressionSyntax.Type.Identifier 似乎是私有(private)的。

我可以使用 SymbolFinder 在解决方案中查找类的所有引用。因为我已经需要解析所有文档,所以它应该可以在没有它的情况下工作。

也许我走错了路?如何获取标识符值?

最佳答案

您需要处理不同类型的 TypeSyntaxes。看这里:http://sourceroslyn.io/#Microsoft.CodeAnalysis.CSharp/Syntax/TypeSyntax.cs,29171ac4ad60a546,references

您在调试器中看到的是一个 SimpleNameSyntax,它确实有一个公共(public)的 Identifier 属性。

更新

var ns = objectCreationExpressionSyntax.Type as NameSyntax;
if (ns != null)
{
return ns.Identifier.ToString();
}

var pts = objectCreationExpressionSyntax.Type as PredefinedTypeSyntax;
if (pts != null)
{
return pts.Keyword.ToString();
}

...

所有其他子类型都需要处理。请注意,ArrayType.ElementType 也是一个 TypeSyntax,因此您很可能需要使此方法递归。

关于c# - Roslyn 在 ObjectCreationExpressionSyntax 中获取 IdentifierName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43804765/

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