答案:.NET 源代码生成器在编译时分析标记特性(如 [HttpApi])的接口,提取方法签名与元数据,自动生成强类型 HTTP 客户端代码,减少手动编写重复逻辑,提升效率与性能。

.NET 中的源代码生成器可以通过在编译期间分析程序中的类型、属性和方法,自动生成调用远程 API 所需的客户端代码。这种方式避免了手动编写重复的 HTTP 请求逻辑,提升开发效率并减少出错可能。
利用源生成器解析 API 接口定义
源代码生成器可以扫描标记了特定特性的接口(如 [HttpApi]),提取其中的方法签名、参数和返回类型。通过 SyntaxReceiver 捕获这些接口,并使用 Microsoft.CodeAnalysis 分析语法树。
例如,定义一个接口:
public interface IUserApiClient{
[Get("/users/{id}")]
Task
}
源生成器读取该接口,识别出 HTTP 方法、路径模板和参数绑定方式。
生成 HttpClient 调用代码
根据接口描述,生成器创建具体类实现。它会注入 IHttpClientFactory 或直接使用 HttpClient,构建请求 URL、序列化参数、发送请求并反序列化响应。
生成的代码通常包含:
- 构造函数接收 HttpClient 实例
- 拼接带参数的 URL(如 /users/123)
- 设置请求头(如 Accept、Content-Type)
- 使用 System.Text.Json 序列化/反序列化数据
- 处理 HttpResponseMessage 并抛出异常或返回结果
支持特性驱动的元数据配置
通过自定义特性(如 [Get]、[Post]、[Header]、[Query]),开发者可声明式地控制请求行为。源生成器读取这些特性的参数,在生成代码时应用对应逻辑。
比如:
[Post("/users")][Header("Authorization", "Bearer {token}")]
Task CreateUsersAsync([Body] User user, string token);
生成器会提取路径、HTTP 方法、头部模板和参数用途,生成符合预期的请求构造逻辑。
编译时生成强类型客户端
最终输出的是纯 C# 代码,嵌入到编译后的程序集中。这类客户端具备强类型检查、IDE 补全支持,且不依赖运行时反射,性能优于传统动态代理方案。
由于是编译期生成,调试时可选择启用源生成器的“可调试”模式,将生成的代码暴露给开发者查看。
基本上就这些。只要定义好接口和规则,源生成器就能自动完成 API 客户端的“体力活”。










