gpt4 book ai didi

c# - 使用 Roslyn 从 ObjectCreationExpressionSyntax 获取构造函数声明?

转载 作者:太空狗 更新时间:2023-10-29 17:50:39 26 4
gpt4 key购买 nike

我正在尝试使用 Roslyn 在 C# 源文件中获取对象创建表达式并添加名称所有参数(因此从 new SomeObject("hello")new SomeObject(文本:“你好”)

我从 SyntaxTree 中获得了 ObjectCreationExpressionSyntax 以及解决方案的 SemanticModel。我正在尝试将 GetSymbol/TypeInfo 用于 ObjectCreationExpressionSyntax 的类型,但我似乎无法使用它来获取参数名称。

基本上我想要得到的是:

特别是 Something.Something 的参数。

最佳答案

SemanticModel 询问您正在访问/重写的节点的 SymbolInfo。它返回的符号应该始终是一个IMethodSymbol,其属性Parameters 包含构造函数的所有参数。

出于好奇,我编写了一个 SyntaxRewriter 来完全满足您的需求。它当然还没有经过彻底的测试,有些情况我会错过(或者只是省略,比如已经命名的参数)。

public class NameAllParametersRewriter : CSharpSyntaxRewriter
{
private readonly SemanticModel _semanticModel;

public NameAllParametersRewriter(Document document)
{
_semanticModel = document.GetSemanticModelAsync().Result;
}

public override SyntaxNode VisitObjectCreationExpression(
ObjectCreationExpressionSyntax node)
{
var baseResult = (ObjectCreationExpressionSyntax)
base.VisitObjectCreationExpression(node);

var ctorSymbol = _semanticModel.GetSymbolInfo(node).Symbol as IMethodSymbol;
if (ctorSymbol == null)
return baseResult;

var newArgumentListArguments = new SeparatedSyntaxList<ArgumentSyntax>();
for (int i = 0; i < baseResult.ArgumentList.Arguments.Count; i++)
{
var oldArgumentSyntax = baseResult.ArgumentList.Arguments[i];
var parameterName = ctorSymbol.Parameters[i].Name;

var identifierSyntax = SyntaxFactory.IdentifierName(parameterName);
var nameColonSyntax = SyntaxFactory
.NameColon(identifierSyntax)
.WithTrailingTrivia(SyntaxFactory.Whitespace(" "));

var newArgumentSyntax = SyntaxFactory.Argument(
nameColonSyntax,
oldArgumentSyntax.RefOrOutKeyword,
oldArgumentSyntax.Expression);

newArgumentListArguments = newArgumentListArguments.Add(newArgumentSyntax);
}

return baseResult
.WithArgumentList(baseResult.ArgumentList
.WithArguments(newArgumentListArguments));
}
}

关于c# - 使用 Roslyn 从 ObjectCreationExpressionSyntax 获取构造函数声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24174602/

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