使用Roslyn代码分析在引用程序集中查找指定类名符号的方法
实现方案
不需要额外加载程序集编译抽象层,你当前持有的Compilation实例本身已经包含了所有引用程序集的符号信息,直接遍历引用即可实现需求,全程基于Roslyn的ISymbol体系,无需使用反射。
示例代码
using Microsoft.CodeAnalysis; using System.Collections.Generic; public static class CompilationExtensions { /// <summary> /// 从当前编译的所有引用程序集中搜索指定名称的类型符号 /// </summary> /// <param name="compilation">当前编译实例</param> /// <param name="typeName">要搜索的类名</param> /// <param name="filter">符号过滤规则</param> /// <returns>匹配的命名类型符号集合</returns> public static IEnumerable<INamedTypeSymbol> GetNamedTypesWithNameFromReferences(this Compilation compilation, string typeName, SymbolFilter filter = SymbolFilter.Type) { foreach (var reference in compilation.References) { // 从引用中获取程序集符号 if (compilation.GetAssemblyOrModuleSymbol(reference) is IAssemblySymbol assemblySymbol) { // 复用和原生方法一致的符号搜索逻辑 foreach (var symbol in assemblySymbol.GlobalNamespace.GetSymbolsWithName(typeName, filter)) { if (symbol is INamedTypeSymbol typeSymbol) { yield return typeSymbol; } } } } } }
使用方式
和你原有调用逻辑几乎完全一致:
var targetTypeSymbols = context.SemanticModel.Compilation.GetNamedTypesWithNameFromReferences(classNameToFind);
补充说明
- 所有返回结果为原生
INamedTypeSymbol类型,可直接用于后续符号判断、成员查询、特性读取等Roslyn操作 - 如果需要同时检索当前编译自身的类型+引用程序集的类型,只需要在遍历逻辑中额外加入
compilation.Assembly.GlobalNamespace.GetSymbolsWithName的查询即可 - 底层复用Roslyn内部的符号索引逻辑,查询性能和原生
GetSymbolsWithName方法一致,无需全量遍历程序集类型
内容的提问来源于stack exchange,提问作者Kilo7
相关产品推荐
相关产品推荐

