找到罗斯林具体方法的参数值

问题描述 投票:1回答:1

我需要找到所有方法调用的发生。

例如:我有一个这样的类:

public class Foo
{
   public string Bar(string firstParam, string secondParam){}
}

我需要做的就是打开一个解决方案,并找到所有的类Foo的方法吧的用法。现在对于每个使用,我想,当它被作为一个字符串传递给取第一个参数的值。

所以,如果我有这条线在我的代码的地方:

foo.Bar("some value", "something else")

然后,我应该找回“一些价值”。

现在,如果我有:

foo.Bar(someProperty, "something else")

然后,我应该忽略它。

在我的研究,我确实发现很多来源,但我似乎无法找到一种方法,它的实际工作。

c# roslyn
1个回答
1
投票

我找到自己的答案。

该解决方案是基于Visual Studio中的“独立代码分析工具”项目模板。

由于此模板自带的解决方案打开和工作区创建,我会跳过这一部分。

private static async Task<List<INamedTypeSymbol>> GetDeclarationOfType(string typeName, Solution solution)
{
     var symbols = await SymbolFinder.FindSourceDeclarationsAsync(solution, x => x.Equals(typeName));
     return symbols.Where(x => x.Kind == SymbolKind.NamedType).Cast<INamedTypeSymbol>().ToList();
}

在这里,我简单地使用SymbolFinder找到我要找的类型的声明。

对于每个返回的符号,我再拿到成员(当时的方法),其中名字是我的类名:

var members = symbol.GetMembers().Where(x => x.Name.Equals("MyMethod"));

对于每一个匹配的成员,然后我得到的所有引用:

var references = await SymbolFinder.FindReferencesAsync(member, solution);

该解决方案是部分基于this one,但我把它修改为我的需要。

因此,对于每一个参考,我会等到我找到一个调用浏览源代码树。当我找到一个,我会得到我要找的参数(基于其指数在这里),如果它是“种”是SyntaxKind.StringLiteralExpression那么我有什么,我需要:

foreach (var referencedSymbol in references)
{
    foreach (var location in referencedSymbol.Locations)
    {
        var theToken = location.Location.SourceTree.GetRoot().FindToken(location.Location.SourceSpan.Start);
        var theNode = theToken.Parent;
        while (!theNode.IsKind(SyntaxKind.InvocationExpression))
        {
            theNode = theNode.Parent;
            if (theNode == null) break; // There isn't an InvocationExpression in this branch of the tree
        }

        if (theNode != null)
        {
            var argument = ((InvocationExpressionSyntax) theNode).ArgumentList.Arguments[searchPattern.ArgumentIndex];
            if (argument.Expression.IsKind(SyntaxKind.StringLiteralExpression))
            {
                textToTranslate.Add(argument.ToString());
            }
        }
    }
}

在参数本身调用ToString()返回参数的实际值,因此,参数的字符串值传递给方法。

作为参考,我的用例是从我的解决方案提取所有翻译字符串。这是使用5点不同的方式来翻译串一个非常大的解决方案(超过170个项目),我需要一种方法来自动发现他们都在代码中,可以自动化的工具。

这可能不是最好的解决办法,但我至少现在是这样做。

© www.soinside.com 2019 - 2024. All rights reserved.