我想根据其类型在InvocationExpressionSyntax
中重新排列参数。如何获得参数的类型?
我已经尝试根据该方法获取类型,但这是不可能的,因为最后一个参数是“对象的参数”,而且我无法从中获取类型。
这是我的示例代码:
var code = SourceText.From(@"
class Foo
{
void Bar()
{
Baz(""Some String"", new Exception(""some exception""), 200);
}
void Baz(string s, params object[] param)
{
Console.WriteLine(""do smth"");
}
}
");
在此示例中,我想在开头重新排列异常,然后在String和其余部分重新排列,但这仅是因为它是一个异常。
我该怎么做?在示例代码中,预期结果应为:
Baz(new Exception(""some exception""), ""Some String"", 200);
直到现在我还没有到达可以更改某些东西的地步,因为我已经无法获取参数的类型。这是我的获取方法引用的代码:
var references = SymbolFinder.FindReferencesAsync(model.GetDeclaredSymbol(methodDeclarationSyntax), workspace.CurrentSolution).Result;
foreach (var referencedSymbol in references)
{
foreach (var referencSymbolLocaiton in referencedSymbol.Locations)
{
var result = GetInvocationExpressionFromLocation(referencSymbolLocaiton);
}
}
这是将InvocationExpressionSyntax
从ReferenceLocation
中剔除的方法:
public static InvocationExpressionSyntax GetInvocationExpressionFromLocation(ReferenceLocation referenceLocation)
{
var ins = referenceLocation.Location.SourceTree.GetRoot()
.FindNode(referenceLocation.Location.SourceSpan);
InvocationExpressionSyntax returnValue = null;
foreach (var invocationExpressionSyntax in ins.SyntaxTree.GetRoot().DescendantNodes().OfType<InvocationExpressionSyntax>())
{
foreach (var b in invocationExpressionSyntax.DescendantNodes().OfType<IdentifierNameSyntax>().Where(syntax => syntax.ToString() == ins.ToString()))
{
if (b.GetLocation().SourceSpan != ins.GetLocation().SourceSpan) continue;
returnValue = invocationExpressionSyntax;
}
}
return returnValue;
}