c# - 在 c# 源代码生成器中使用多个项目
问题描述
我正在尝试构建一个 C# 源代码生成器,我需要在其中引用解决方案中另一个项目中的源文件 (.cs)。有没有一种干净的方法来做到这一点?
为了清楚起见,这是我的上下文。
我正在构建一个 Blazor webapp,其中有一个服务器和一个客户端。我使用属性路由在 webapi 中设置 url。
[HttpGet]
[Route("api/clients/{id}", Name = "Client")]
public async Task<ClientViewModel> GetById(int id)
{
var client = await _clientLogic.GetById(id);
return _clientViewLogic.ToViewModel(client);
}
我想避免
- 在服务器上,必须使用路由名称来构建 url。因为我没有对路由名称进行任何编译检查,并且如果我更改名称并忘记更新呼叫可能会出错。
- 在客户端,必须直接使用原始 url,因为我无权访问服务器上下文来构建它。
相反,我想使用这样的东西
var url = GetClientUrl(clientId);
这应该很容易使用可以转换的源生成器来实现
[Route("api/clients/{id}", Name = "Client")]
进入
public string GetClientUrl(string id)
{
return $"api/clients/{id}";
}
问题是,当我使用 Blazor 时,我需要将代码放入我的服务器项目和客户端项目都引用的共享项目中。但是如果我将源生成器添加到Shared项目中,那么我只有这个项目的编译上下文,我无法访问我的Server项目中的 Route 属性来构建我的函数。
所以我的全部问题是,有没有办法从链接到我的共享项目的源生成器访问我的服务器编译上下文?
我看到解决此问题的一种方法是忽略源生成器提供的编译上下文,并通过硬编码路径或其他东西基于解决方案中的所有项目创建一个新的。这应该可以,但感觉不是很干净。
解决方案
推荐阅读
- authentication - 在 .NET Core 中获取当前身份验证提供程序
- powershell - Powershell 为动态对齐计算 RightPad 值
- java - Springboot - 如何保存多对多关系数据
- php - PHP - 使用 PHP 将 word 转换为 PDF
- powerbi - 如何将 SSDT 的侦听端口从 localhost 更改为我机器的接口 IP
- ios - Swift - 以编程方式更改 UICollectionViewCell 大小
- java - 使用 STAXON 将 XML 转换为 JSON
- python - 将可迭代解压缩为下标/类型提示?
- python - 使用 sklearn 将 pkl 文件(来自 python2)加载到 python 3
- ios - 如何在 PDFKit 中显示从 Internet 下载的 pdf?