Я хочу переставить аргументы в InvocationExpressionSyntax
в соответствии с их типом.Как я могу получить тип аргумента?
Я уже пытался получить тип в соответствии с методом, но это невозможно, потому что последний параметр является «params of object», и я никак не могуможно получить тип из этого.
Вот мой пример кода:
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"");
}
}
");
В этом примере я хочу переставить исключение в начале, а затем в строку и остальные, но только потому, что это исключение.
Как мне это сделать?В примере кода ожидаемый результат должен быть:
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;
}