【发布时间】:2020-06-24 14:22:14
【问题描述】:
我一直在尝试在整个解决方案中找到对方法的所有引用。有人会认为 SymbolFinder.FindReferencesAsync 将 ISymbol 作为参数进行搜索,而解决方案对象会这样做,但它不会......
所有文章和 SO 问题/答案似乎都将其作为解决方案。它适用于在包含它的程序集中查找对方法的所有引用,但不适用于引用它的任何项目。我有一个理论,这是因为当您进行引用时,引用程序集中的方法符号不同,他们希望您获取该符号,然后使用 SymbolFinder.FindSourceDeclarationsAsync 将其解析为您正在寻找的实际符号。
如果是这样的话,我真的不知道该怎么做?也许以某种方式获取程序集中所有符号的列表,然后对每个人进行 FindSource 调用并比较它以查看它是否引用了您的 MethodSymbol?我当然希望不会!
这是一个简单的例子
public void Find2()
{
string solutionPath = @"C:\Projects\RoslynTestTargetProject\RoslynTestTargetProject.sln";
var msWorkspace = MSBuildWorkspace.Create();
var solution = msWorkspace.OpenSolutionAsync(solutionPath).Result;
var methodProjectComp = solution.Projects.Single(x => x.Name == "RoslynTestTargetProject").GetCompilationAsync().Result;
// I have loaded these all kinds of different ways but it never impacts the end result
var classWithMethodToSearchFor = methodProjectComp.GetTypeByMetadataName("RoslynTestTargetProject.Class1");
var methodToSearchFor = classWithMethodToSearchFor.GetMembers("GetPerson").First() as IMethodSymbol;
var references = SymbolFinder.FindReferencesAsync(methodToSearchFor, solution).Result;
var callers = SymbolFinder.FindCallersAsync(methodToSearchFor, solution).Result;
int c = references.Select(x => x.Locations.Count()).Sum();
}
这是具有我正在搜索的方法和一个引用的类。
public class Class1
{
public Class1() {}
public Person GetPerson(Guid id) => new Person();
public IEnumerable<Person> GetPeople(IEnumerable<Guid> ids) => ids.Select(x => GetPerson(x));
}
对它的另一个引用只是一个简单的控制台项目,具有以下内容:
public static void GetPersonOutsideReference()
{
var c = new Class1();
c.GetPerson(Guid.NewGuid());
}
我希望 Find2 方法末尾的计数返回 2,类中的引用为 1,其他项目中的引用为 1,但它始终为 1。
【问题讨论】:
-
你有项目引用或DLL引用吗?
-
您需要有一个源符号而不是引用符号才能进行查找所有引用。