是否可以在 C# Roslyn 代码生成中引用现有源文件?

Is it possible to reference existing source files in C# Roslyn Code Generation?

所以考虑一下我在当前正在生成的项目中有一个 class ClassA 的情况:

public class ClassA
{
    public ClassA(int a)
    {
        A = a;
    }

    public int A { get; set; }
}

假设我想为 ClassA 自动创建一个扩展方法,例如:

public static class ClassAExtensions
{
    public static ClassA Double(this ClassA classA)
    {
        return new ClassA(classA.A * 2);
    }
}

尝试使用新的源代码生成器创建此源代码时,编译似乎找不到 ClassA。我尝试将 ClassA 的命名空间添加到生成的文档中,并将生成的扩展方法 class 的命名空间直接设置为 ClassA 的命名空间,但似乎都看不到它:

The type of namespace 'ClassA' does not exist in the namespace 'ClassANamespace' (are you missing an assembly reference?)

所以最后的问题是:

提供的许多示例都声明 class 正在修改 partial,但我并不是特别喜欢我正在尝试做的事情。

我也研究过添加程序集引用,但我的理解是生成的代码应该与现有代码一起包含和编译。此外,如果此代码在我的“生产”代码之前被编译,则无法添加程序集引用 and/or 这将创建循环引用。

从其余语言规则的角度来看,添加到源代码生成器中的文件就像常规文件一样,所以是的,只要您正确地限定它们,您绝对可以在用户代码中引用 类。听起来你有问题;如果仍然存在特定问题,您可能想尝试创建一个既包含输入文件又包含源生成的输出的项目;您应该会看到相同的错误,然后才能弄清楚发生了什么。