问题标签 [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# - 从源生成器内部读取属性属性
背景
我正在尝试使用 C# 源代码生成器。这主要是一个实验项目,但目标是创建一个库,以帮助用户使用键值对格式编写日志。在编译时应该有一组预定义的公共键。enum
在用户声明 an并用特殊属性装饰它之前,库不会知道这些是什么。成员可以选择用enum
声明Type
键是什么的附加属性进行修饰(如果该属性不存在,我们假设它是一个字符串)。这是enum
我正在使用的 s:
所以,作为一个例子,我们可能有这样的事情:
现在库要做的是创建一个像这样的新方法:
问题
到目前为止,我已经按照我想要的方式完成了所有工作,但是我对读取FieldType
. LogMemberAttribute
我可以看到是否LogMember
存在,并且在调试器中,我可以看到它被设置为int
or string
,但在代码中我无法弄清楚如何将其拉出并使用它。
源代码
这是我的方法的(简化版本)Execute
(注意:我意识到这里有些东西不是最佳的。没关系 - 现在我们只担心从属性中读取):
那么是否有可能获取这些数据?恐怕我对 SyntaxTrees 和诸如此类的东西不是很好,所以似乎我可以做一些事情来给我想要的东西,但我只是不知道那是什么。
c# - C# 源代码生成器不包括来自项目参考的结果
Edit3:在某些时候,这才开始起作用。不知道为什么。也许这是一个修复的VS错误?
Edit2:查看解决方案资源管理器中的 Analyzers 节点,我发现源生成器在我第一次打开程序时成功运行,然后它停止并且它生成的所有内容在对我的代码进行一些更改后就消失了。
编辑:按照评论的建议调用后Debugger.Launch()
,我可以确认生成器代码正在运行,并且源文本看起来与预期的完全一样。但是 IDE 和编译器仍然会出现错误,就好像没有包含结果一样。
我正在尝试设置一个源生成器以从本地项目引用运行,但无法使其实际运行。我的 NUnit 测试通过了,所以我知道实际的生成逻辑很好,但是准系统测试项目在 Visual Studio 中都无法编译并报告错误。我正在使用 Visual Studio 2022 Preview 5.0,以防万一。
roslyn - 使用 Roslyn 代码分析在引用的程序集中查找符号
我需要在所分析的编译的引用程序集中搜索具有指定类名的类型,而不管它所在的命名空间如何。
本质上,我需要一个函数来搜索引用的程序集,就像下面的方法搜索正在分析的编译一样。
有没有办法使用程序集名称加载编译抽象?只要我不必使用反射,我就可以使用粗略的方法……这样我就可以继续使用 ISymbol。
c# - 有没有办法从消费项目配置源生成器?
我可以通过查找 JSON 文件并使用它来配置源生成器,但是这种方法是有限的并且通常实施起来很慢。
我正在寻找的是消费项目上流利的语法,例如
据我所知,这不存在,但我很乐意被证明不是这样。
我推测的一个 hacky 解决方案是使用另一个源生成器进行流畅配置,然后配置原始源生成器。这可以工作,但会如此复杂,必须有另一种方式。
c# - Source Generator 仅从第一个 context.AddSource 发出代码
我正在尝试设置一个基于附加文件生成代码的源生成器。
源生成器实际运行,但我的问题是只有第一个:
context.AddSource
实际发出代码。
当我去时,Solution Explorer -> Dependencies -> Analyzers -> <GeneratorName>
我只能看到一个正在生成的文件,在使用调试器查看后,它对应于第一个context.AddSource
. 调试时,我实际上可以看到生成器遍历我的foreach
循环并调用context.AddSource
,但该代码并未添加到编译中。
在.csproj
我添加的引用项目中(我用正确的路径替换了路径):
并且.csproj
生成器是:
这是我的Execute
方法:
c# - .NET 6 的 System.Text.Json 源代码生成不起作用
根据这篇文章,我尝试实现基于源生成的 JSON 序列化:
我的代码如下:
和我的 SerializationContext :
我的System.Text.Json
项目中安装了 6.0.0 版本。
但是在运行时,我的类dotnet build
中没有生成任何代码。PersonJsonContext
我不明白为什么。
有什么线索吗?
c# - System.Text.Json 源代码生成和 TimeSpan
我正在尝试System.Text.Json
与源生成一起使用。不幸的是,我有一个类有一个TimeSpan
需要序列化的数据成员。但是,我无法让它与源生成一起使用,因为它总是尝试序列化私有数据成员_ticks
。我不知道是否有办法禁用给定类型的源生成并改用用户提供的源生成。我什至试图忽略这些字段,但似乎没有考虑到:
仍然给出以下错误:
'TimeSpan._ticks' 由于其保护级别而无法访问
你知道是否有解决方法吗?
这是生成错误的源生成部分: 这是 TimeSpan 序列化生成源的一部分,导致错误的部分,它是生成Context.TimeSpan.g.cs
文件的一部分: