【发布时间】:2015-08-28 01:50:46
【问题描述】:
给定一个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?
我看过SymbolFinder、Compilation 和INamedTypeSymbol,但我没有运气。
编辑:FindDerivedClassesAsync 方法看起来很接近我的需要。 (我不是 100% 确定它在引用的程序集中找到派生类)。不过它是内部的,所以我打开了an issue。
【问题讨论】:
-
你能引用“Assembly”对象吗?
-
如果您可以拥有程序集对象,您可以使用 GetTypies 方法并使用 IsAssignableFrom 方法进行过滤
-
获得
Assembly对象并不容易,而且我知道可以使用反射,但我更喜欢使用Roslyn。