跨程序集符号查找
本文档介绍如何在多个程序集中查找和解析符号。
📋 文档信息
| 属性 | 值 |
|---|---|
| 难度 | 高级 |
| 阅读时间 | 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