You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:30:04