在 C# 源生成器中使用多个项目

cpa*_*lus 7 .net c#

我正在尝试构建一个 C# 源生成器,其中我需要引用解决方案中另一个项目中的源文件 (.cs)。有没有一种干净的方法来做到这一点?

为了清楚起见,这是我的背景。

我正在构建一个 Blazor Web 应用程序,其中有一个服务器和一个客户端。我使用属性路由来设置 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);
}
Run Code Online (Sandbox Code Playgroud)

我想避免

  • 在服务器上,必须使用路由名称来构建 url。因为我没有对路由名称进行任何编译检查,如果更改名称并忘记更新调用,则可能会出现错误。
  • 在客户端,必须直接使用原始 url,因为我无权访问服务器上下文来构建它。

相反,我想使用这样的东西

var url = GetClientUrl(clientId);
Run Code Online (Sandbox Code Playgroud)

这应该可以通过源生成器轻松实现,该源生成器可以将

[Route("api/clients/{id}", Name = "Client")]
Run Code Online (Sandbox Code Playgroud)

进入

public string GetClientUrl(string id)
{
    return $"api/clients/{id}";
}
Run Code Online (Sandbox Code Playgroud)

问题是,当我使用 Blazor 时,我需要将代码放入由我的服务器项目和客户端项目引用的共享项目中。但是,如果我将源生成器添加到共享项目,那么我只有该项目的编译上下文,并且无法访问服务器项目内的路由属性来构建我的函数。

所以我的完整问题是,有没有办法从链接到我的共享项目的源生成器访问我的服务器编译上下文?

我认为解决此问题的一种方法是忽略源生成器提供的编译上下文,并通过对路径或其他内容进行硬编码来基于解决方案中的所有项目创建一个新的编译上下文。这应该可以,但感觉不太干净。