问题描述
我想验证仅在项目中可见的属性,这是编译操作的默认命名空间值。我能够找到 validate project references 的功能,但这不提供读取默认项目命名空间的选项。
是否可以使用 Roslyn Analyzer?
编辑:我发现在编译开始期间有一些可用的属性,但这并没有提供想要的信息:
context.Compilation.GlobalNamespace.IsNamespace > returns true
context.Compilation.GlobalNamespace.IsGlobalNamespace > returns true
context.Compilation.GlobalNamespace.Name > returns ""
context.Compilation.GlobalNamespace.TodisplayString() > returns "<global namespace>"
我知道我可以去每个类并检查命名空间,但事实并非如此,因为我想知道默认项目的命名空间。一个例子: 项目名称=“Project.UnitTests”,程序集=“Project.UnitTests”,默认命名空间是“Project.UnitTest”。默认命名空间与项目不匹配,因为项目名称是复数,而命名空间是单一含义。
解决方法
就我而言,它用于 C# 源生成器,而不是分析器,但无论如何我成功地在我的源生成器中获取了目标项目的根命名空间。
详细文档在这里:
首先,您必须在目标项目文件(它不是源生成器项目文件)的项组中声明 <CompilerVisibleProperty>
项,以允许源生成器检索指定的 MSBUild 属性值。
在这种情况下,您应该指定 RootNamespace
属性。
...
<!-- This is the target application's .csproj file -->
<ItemGroup>
<CompilerVisibleProperty Include="RootNamespace" />
</ItemGroup>
...
之后,您可以通过如下代码获取根命名空间,而不是引用 context.Compilation.GlobalNamespace
。
...
// This is C# Source Generator's .cs file.
[Generator]
public class MySourceGenerator : ISourceGenerator
{
public void Execute(GeneratorExecutionContext context)
{
context.AnalyzerConfigOptions.GlobalOptions.TryGetValue("build_property.RootNamespace",out var rootNamespace);
...
我不确定此代码是否也适用于 C# Analyzor,但我希望这些信息对您有所帮助。