gpt4 book ai didi

c# - 查找从给定 INamedTypeSymbol 继承的类型

转载 作者:太空狗 更新时间:2023-10-29 17:57:05 26 4
gpt4 key购买 nike

给定一个 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?

我查看了 SymbolFinderCompilationINamedTypeSymbol,但我没有任何运气。

编辑 FindDerivedClassesAsync方法看起来接近我需要的。 (我不是 100% 确定它在引用的程序集中找到派生类)。但是它是内部的,所以我打开了 an issue .

最佳答案

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)));

( code borrowed from Tunnel Vision Laboratories Github )

祝你好运!

更新:

此方法现已公开。 (source)

关于c# - 查找从给定 INamedTypeSymbol 继承的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32262137/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com