使用Roslyn获取方法参数

Kev*_*ton 13 .net c# roslyn

我可以使用以下代码从所有调用特定方法的解决方案中获取列表:

var createCommandList = new List<MethodSymbol>();
INamedTypeSymbol interfaceSymbol = 
   (from p
    in solution.Projects
    select p.GetCompilation().GetTypeByMetadataName(
        "BuySeasons.BsiServices.DataResource.IBsiDataConnection")
    ).FirstOrDefault();
foreach (ISymbol symbol in interfaceSymbol.GetMembers("CreateCommand"))
{
    if (symbol.Kind == CommonSymbolKind.Method
        && symbol is MethodSymbol)
    {
        createCommandList.Add(symbol as MethodSymbol);
    }
}
foreach (MethodSymbol methodSymbol in createCommandList)
{
    foreach (ReferencedSymbol referenceSymbol
        in methodSymbol.FindReferences(solution))
    {
        foreach (ReferenceLocation referenceLocation
            in from l
               in referenceSymbol.Locations
               orderby l.Document.FilePath
               select l)
        {
            if (referenceLocation.Location.GetLineSpan(false)
                    .StartLinePosition.Line ==
                referenceLocation.Location.GetLineSpan(false)
                    .EndLinePosition.Line)
            {
                Debug.WriteLine("{0} {1} at {2} {3}/{4} - {5}",
                    methodSymbol.Name,
                    "(" + String.Join(",",
                       (from p
                        in methodSymbol.Parameters
                        select p.Type.Name + " " + p.Name).ToArray()
                       ) + ")",
                Path.GetFileName(referenceLocation.Location.GetLineSpan(false)
                    .Path),
                referenceLocation.Location.GetLineSpan(false)
                    .StartLinePosition.Line,
                referenceLocation.Location.GetLineSpan(false)
                    .StartLinePosition.Character,
                referenceLocation.Location.GetLineSpan(false)
                    .EndLinePosition.Character));
            }
            else
            {
                throw new ApplicationException("Call spans multiple lines");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但这给了我一份清单ReferencedSymbol.虽然这给了我调用该方法的文件和行号,但我也希望获得调用该方法的特定参数.我如何转换我拥有的或与Roslyn获得相同的信息?(注意我首先使用Solution.Load方法加载解决方案然后循环以找出方法的定义/声明的位置(createCommandList)).

Mat*_*ren 0

您可以在特定源位置搜索引用的语法树,以找到您要查找的节点。您需要从树的根节点使用像 DescendentNodes 这样的调用,并且您可能需要请求您正在寻找的特定于语言的节点类型。一旦引用树中有了节点,您就可以使用该树的语义模型来告诉您有关参数的其他信息。