c# - 如何使用 Roslyn 分析器验证 Projects 属性默认命名空间
问题描述
我想验证仅在项目中可见的属性,这是编译操作的默认命名空间值。我能够找到验证项目引用的能力,但这不提供读取默认项目命名空间的选项。
是否可以使用 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# Source Generator,而不适用于 Analyzer,但无论如何我成功地在我的源生成器中获取了目标项目的根命名空间。
详细文档在这里:
首先,您必须<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,但我希望这些信息对您有所帮助。
推荐阅读
- python - 根据阈值字典替换某些列中的值?
- angular - core.js:6014 错误类型错误:无法读取未定义的属性“模板”
- html - 我想在菜单或顶栏之后分页/分屏
- windows - 为什么在 Jenkins 管道步骤中单个“D”字符消失了?
- presto - AWS Athena(Presto)如何将映射转置到列
- css - 左侧手风琴上的加/减图标
- javascript - 从 2 个数组中删除相同的值
- r - 偏移量作为参数和公式之间的区别
- javascript - 无法通过 Angular 中的路由显示组件
- python - 使用 numpy.save 保存和使用 pickle.load 加载时出错