问题标签 [sourcegenerators]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - Net6 Json 源生成器忽略模型属性
我正在尝试将新的 NET6 JSON 源代码生成与最少的 API 相结合,以尝试最大化性能。我有一个我试图与 Source Generation 一起使用的模型,它必须包含来自该库的引用属性:Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite
我从库中收到此错误:
我想忽略整个属性,而不是将其包含在源代码生成中。那可能吗?
我的最小 API 代码如下所示: https ://github.com/aherrick/Net6JsonSourceGenerator
c# - 使用带有自定义 JsonConverter 的 System.Text.Json 源生成器
自定义类如何与源生成器JsonConverter<>
一起使用?System.Text.Json
我想调用JsonSerializer.Deserialize<MyType[]>()
它不会回退到基于反射的实现并使用自定义MyTypeJsonParser : JsonConverter<MyType>
.
编辑澄清:自定义转换器是为 实现的MyType
,但 json 包含一个对象数组MyType
。因此,我想创建JsonSerializerContext
反序列array
化MyType
对象(MyType[]
)的源生成,使用生成的代码反序列化array
部分和手动转换器反序列MyType
化对象部分。
旧代码(不使用源代码生成器)通过将自定义转换器添加到JsonSerializerOptions.Converters
.
但是,经过进一步研究,我发现Converters
. 文档JsonSourceGenerationOptionsAttribute
中的表格还指出,并且在序列化优化模式中不受支持。因此,目前(.NET 6)似乎不可能将自定义转换器与 json 源生成器混合。JsonConverterAttribute
JsonSerializerOptions.Converters
文档不清楚,至少元数据收集源生成模式是否可以使用JsonConverterAttribute
.
c# - 如何使增量源生成器在 Visual Studio 中运行?
我按照文档创建了一个基本的增量源生成器,它输出标有属性的类的副本:
源代码生成本身工作得很好,但是在将它与 Visual Studio 2022 一起使用时遇到了两个问题:
- 源代码生成器仅在构建期间执行。
- 在我重新启动 Visual Studio 之前,Intellisense 不会获取生成的代码。
- 我可以通过将生成的源文件写入项目目录来解决这个问题,但这并不理想,并且仍然受到上述问题的影响:在我尝试构建之前,更改不会反映出来。
例如,如果我Foo
使用 [Copy] 属性创建一个新类,然后尝试Copy_Foo
在我的代码中引用,Visual Studio 将显示一个Copy_Foo
未定义的错误。
构建此代码将成功,但 Visual Studio 将继续认为Copy_Foo
不存在。一旦我重新启动,它就会知道它的Copy_Foo
存在,但是在我再次重新启动之前,它的任何更改都不会被拾取。
我创建了一个小示例,它仅输出 [Copy] 属性。
第一个项目包含源生成器:
第二个消耗生成器:
如果创建没有 的 TestSourceGenerator.Test 项目ProjectReference
,在 Visual Studio 中打开它,然后编辑项目文件以引用分析器,你会看到 Visual Studio 在 上显示错误[Generated.CopyAttribute]
,但项目构建成功。
有什么方法可以让 Visual Studio 在 IDE 中运行我的源代码生成器并从生成的代码中获取符号?根据文档,这似乎应该是一个受支持的用例,甚至是增量源生成器存在的主要动机之一。
sourcegenerators - SourceGenerator/IncrementalGenerator 调试
我们曾经能够使用VS 2019 中https://github.com/amis92/csharp-source-generators#tips--tricks中的这个技巧来调试源代码生成器。
我们已升级到 VS 2022(更新 2),这不再有效。
此功能是否已删除或说明是否已更改?
我检查了 github 并没有发现任何有用的东西。
c# - 如何在 C# 源代码生成器中获取对类的所有引用
如何使用 C# 源生成器获取对记录的所有引用?反之亦然,如何通过引用获取类的定义?(哪个更快?)
这是对它的引用:
我尝试了一种方法:从 GeneratorSyntaxContext 我分析语法节点是否是带有 GenerateAttribute 的记录。我记得这些类名,当我遇到 InvocationExpressionSyntax 时,我会检查名称标识符是否在记住的名称中。这种方法是有缺陷的,因为调用可能比定义更早被发现。
我想我必须以某种方式从每个参考中获取语义模型?还是更容易从类定义的语义模型中找到所有引用?提前致谢。
c# - 在生产构建上下文中未调用增量源生成器
给定一个工作的源代码生成器和一个用于该生成器的工作测试项目。
发电机
测试项目
测试运行没有错误,类型和方法生成正确。但是我绝对讨厌用纯文本编写测试,加上执行这样的测试不会产生测试覆盖率或单元测试用例,所以我想为源生成器编写一个生产测试。按照惯例,我创建了一个.Run.Tests
项目并将Rustic.DataEnumGen
nuget项目添加为分析器。像这样
这与前一个测试中的代码完全相同,但包装在 aTestFixture
而不是控制台应用程序中。所以我用分析器构建项目,这样DataEnumAttribute
生成然后添加上面的代码。但是代码不能编译,因为类型DataEnum
还是DataEnumAttribute
不存在的。
首先我认为我需要 (I) ReferenceOutputAssembly
,但这也没有改变任何东西,然后我尝试了删除OutputItemType="Analyzer"
和希望这会导致调用分析器的组合;没有任何帮助。
我得出结论,在这个例子中,导入的源代码生成器,在第一个测试用例中使用纯文本编译时工作的相同,在构建项目之前没有执行,因为如果是这种情况,那么类型总是由生成器将在项目中可用,我会Rusic.*.g.cs
在obj/
目录中看到一些。事实并非如此。
那么也许生成器没有打包在 nuget 包中?如您所见,分析仪正在打包。也许我也需要IncludeBuildOutput
?不,也不工作。
现在我的问题是为什么会这样?IIncrementalGenerator
与 相比,导入项目时是否有一些特定的东西,一些特定的属性,我需要注意ISourceGenerator
,因为在项目中使用 anISourceGenerator
的工作方式完全相同?
还有什么我可以尝试让增量源生成器工作的,还是我应该恢复使用常规源生成器?
对好文章的引用也有帮助,因为实际上找不到文档。工作时我参考了大部分Andrew Lock的源码生成器相关文章,特别是这一篇。
我在一周前测试了这个 mit net 6.0.101 和 6.0.2xx 的构建。