查找从给定的INamedTypeSymbol继承的类型

Jos*_*rty 9 c# roslyn

给定INamedTypeSymbol(来自引用的程序集,而不是源代码)如何找到从此类型继承的所有类型(在源程序集和引用程序集中)?

在我的特殊情况下,我正在寻找所有继承的类型NUnit.Framework.TestAttribute.我可以访问命名类型符号,如下所示:

var ws = MSBuildWorkspace.Create();
var soln = ws.OpenSolutionAsync(@"C:\Users\...\SampleInheritanceStuff.sln").Result;
var proj = soln.Projects.Single();
var compilation = proj.GetCompilationAsync().Result;

string TEST_ATTRIBUTE_METADATA_NAME = "NUnit.Framework.TestAttribute";
var testAttributeType = compilation.GetTypeByMetadataName(TEST_ATTRIBUTE_METADATA_NAME);

//Now how do I find types that inherit from this type?
Run Code Online (Sandbox Code Playgroud)

我已经采取一看SymbolFinder,CompilationINamedTypeSymbol,但我没有任何运气.

编辑:FindDerivedClassesAsync方法看起来接近我需要的.(我不是100%确定它在引用的程序集中找到派生类).不过它是内部的,所以我开了一个问题.

Jon*_*mit 3

FindDerivedClassesAsync确实是您正在寻找的。
它在引用的程序集中查找派生类,正如您在源代码中看到的那样DependentTypeFinder(注意locationsInMetadata变量)。

至于使用它,你总是可以同时进行反射:

 private static readonly Lazy<Func<INamedTypeSymbol, Solution, IImmutableSet<Project>, CancellationToken, Task<IEnumerable<INamedTypeSymbol>>>> FindDerivedClassesAsync
            = new Lazy<Func<INamedTypeSymbol, Solution, IImmutableSet<Project>, CancellationToken, Task<IEnumerable<INamedTypeSymbol>>>>(() => (Func<INamedTypeSymbol, Solution, IImmutableSet<Project>, CancellationToken, Task<IEnumerable<INamedTypeSymbol>>>)Delegate.CreateDelegate(typeof(Func<INamedTypeSymbol, Solution, IImmutableSet<Project>, CancellationToken, Task<IEnumerable<INamedTypeSymbol>>>), DependentTypeFinder.Value.GetMethod("FindDerivedClassesAsync", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)));
Run Code Online (Sandbox Code Playgroud)

代码借自 Tunnel Vision Laboratories Github

祝你好运!

更新:

目前该方法已经公开。(来源)