Skip to content

跨程序集符号查找

本文档介绍如何在多个程序集中查找和解析符号。


📋 文档信息

属性
难度高级
阅读时间20 分钟
前置知识编译基础、程序集加载
相关文档程序集加载元数据引用

🎯 学习目标

  • ✅ 通过元数据名称查找类型
  • ✅ 在特定程序集中查找类型
  • ✅ 查找实现特定接口的类型
  • ✅ 查找继承自特定基类的类型

查找类型

通过元数据名称查找

csharp
using Microsoft.CodeAnalysis;

public INamedTypeSymbol FindTypeByMetadataName(
    Compilation compilation,
    string metadataName)
{
    // 在所有引用的程序集中查找类型
    // 例如: "System.Collections.Generic.List`1"
    return compilation.GetTypeByMetadataName(metadataName);
}

在特定程序集中查找

csharp
public INamedTypeSymbol FindTypeInSpecificAssembly(
    Compilation compilation,
    string assemblyName,
    string typeName)
{
    // 查找指定名称的程序集
    var assembly = compilation.References
        .Select(r => compilation.GetAssemblyOrModuleSymbol(r) as IAssemblySymbol)
        .FirstOrDefault(a => a != null && a.Name == assemblyName);
    
    if (assembly == null)
    {
        return null;
    }
    
    // 在程序集中查找类型
    return FindTypeInAssembly(assembly, typeName);
}

查找常用类型

csharp
public Dictionary<string, INamedTypeSymbol> FindCommonTypes(
    Compilation compilation)
{
    var types = new Dictionary<string, INamedTypeSymbol>();
    
    // 查找常用类型
    types["List"] = compilation.GetTypeByMetadataName(
        "System.Collections.Generic.List`1");
    types["Dictionary"] = compilation.GetTypeByMetadataName(
        "System.Collections.Generic.Dictionary`2");
    types["Task"] = compilation.GetTypeByMetadataName(
        "System.Threading.Tasks.Task");
    types["IEnumerable"] = compilation.GetTypeByMetadataName(
        "System.Collections.Generic.IEnumerable`1");
    
    return types;
}

关键要点

  • ✅ 使用 GetTypeByMetadataName 是查找类型最高效的方式
  • ✅ 泛型类型需要使用反引号和参数数量(如 List\1`)
  • ✅ 可以在特定程序集中查找类型
  • ✅ 支持查找实现特定接口或继承特定基类的类型

相关文档


最后更新: 2026-02-06

基于 MIT 许可发布