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