从 Roslyn 中的方法调用中的相应参数获取方法参数的名称
Obtaining name of a method parameter from the corresponding argument in a method invocation in Roslyn
我想知道是否有一些现有的逻辑可以通过查看特定 method/constructor。基本上,我只是希望能够为将作为参数传递给调用的变量获取默认名称。因此,如果这样定义一个方法:
public void Foo(object firstParam, object secondParam, object thirdParam)
我希望能够说出以下调用的第二个参数
object bar = null;
this.Foo(null, bar, null)
的名字应该是 "secondParam"。基本上,我只想将一个参数与它在调用中占据 "spot" 的原始参数相关联。
我想问的是 Roslyn 中是否已经存在我不知道的任何 util 方法,因为有一些更复杂的场景需要处理,例如命名参数或可选参数。我在此期间提出的解决方案应该涵盖某些情况,但可能不是所有情况(尤其是参数,它应该需要一些更专门的逻辑来处理)。这是我目前拥有的:
private IEnumerable<IdentifierNameSyntax> GetParameterNamesFromArgumentList(ArgumentListSyntax argumentList, SyntaxNodeAnalysisContext context)
{
var arguments = argumentList.Arguments;
var parameters = argumentList.Parent.GetSymbolOrDeclaredAs<IMethodSymbol>(context)?.Parameters;
if (parameters != null)
{
var index = 0;
foreach (var parameter in parameters)
{
var argument = index < arguments.Count ? arguments[index] : null;
if (argument != null && argument.NameColon == null)
{
yield return SyntaxFactory.IdentifierName(parameter.Name);
}
else if (argument != null)
{
yield return argument.NameColon.Name;
}
index++;
}
}
}
我可以在方法符号上使用 DeclaringSyntaxReferences
,但我认为仅使用 IParameterSymbol
中的名称就足以满足我的需要。同样,如果这种逻辑已经在其他任何地方实现,我宁愿使用它。如果没有,好吧,请随时告诉我您对问题的看法。
遗憾的是,我认为没有好的 public 方法可以做到这一点。请参阅 Roslyn 的内部 DetermineParameter
帮助程序以获取可能有帮助的内容。
我想知道是否有一些现有的逻辑可以通过查看特定 method/constructor。基本上,我只是希望能够为将作为参数传递给调用的变量获取默认名称。因此,如果这样定义一个方法:
public void Foo(object firstParam, object secondParam, object thirdParam)
我希望能够说出以下调用的第二个参数
object bar = null;
this.Foo(null, bar, null)
的名字应该是 "secondParam"。基本上,我只想将一个参数与它在调用中占据 "spot" 的原始参数相关联。
我想问的是 Roslyn 中是否已经存在我不知道的任何 util 方法,因为有一些更复杂的场景需要处理,例如命名参数或可选参数。我在此期间提出的解决方案应该涵盖某些情况,但可能不是所有情况(尤其是参数,它应该需要一些更专门的逻辑来处理)。这是我目前拥有的:
private IEnumerable<IdentifierNameSyntax> GetParameterNamesFromArgumentList(ArgumentListSyntax argumentList, SyntaxNodeAnalysisContext context)
{
var arguments = argumentList.Arguments;
var parameters = argumentList.Parent.GetSymbolOrDeclaredAs<IMethodSymbol>(context)?.Parameters;
if (parameters != null)
{
var index = 0;
foreach (var parameter in parameters)
{
var argument = index < arguments.Count ? arguments[index] : null;
if (argument != null && argument.NameColon == null)
{
yield return SyntaxFactory.IdentifierName(parameter.Name);
}
else if (argument != null)
{
yield return argument.NameColon.Name;
}
index++;
}
}
}
我可以在方法符号上使用 DeclaringSyntaxReferences
,但我认为仅使用 IParameterSymbol
中的名称就足以满足我的需要。同样,如果这种逻辑已经在其他任何地方实现,我宁愿使用它。如果没有,好吧,请随时告诉我您对问题的看法。
遗憾的是,我认为没有好的 public 方法可以做到这一点。请参阅 Roslyn 的内部 DetermineParameter
帮助程序以获取可能有帮助的内容。