我正在使用SymbolFinder
在我的解决方案中查找对某个类型的所有引用,如下所示:
ISymbol typeOfInterest = compilation.GetTypeByMetadataName(
"System.Reflection.PropertyInfo");
var references = SymbolFinder.FindReferencesAsync(typeOfInterest, solution).Result;
foreach (var reference in references)
{
// reference.Locations => symbol?
}
此部件工作正常,SymbolFinder
返回正确的ReferenceLocations
(手动检查)。我实际上对这些位置的符号感兴趣,以获取有关引用的更多(语义)信息,因此我可以过滤/使用它(例如,仅适用于属性)。
关于 Roslyn 的公开信息似乎很少,我在 SDK 预览版的示例中找不到任何与SymbolFinder
结果相关的内容。所以我的问题来了:是否有可能获得与ReferenceLocation
对应的符号?如何?
因此,在这些位置中没有严格的"符号",至少没有与生俱来的概念。您可以做的是获取该位置,并找到封闭符号。您可以获取该位置的SyntaxTree
并获得Document
。从那里,呼叫GetSemanticModelAsync
,然后呼叫ISemanticModel.GetEnclosingSymbol
。
例如,下面是一些为 FAR 本身执行此操作的(内部)代码:https://github.com/dotnet/roslyn/blob/748d6ab1b504ceee0c29f132fdcbe2a777aa88ea/src/Workspaces/Core/Portable/FindSymbols/ReferenceLocationExtensions.cs#L67-L101