无法解析 Roslyn Source Generator 中的参数参数
Canot resolve argument parameters in Roslyn Source Generation
我无法从源生成器中的属性获取参数值。
我有一个 IIncrementalSourceGenerator,它应该查找 class 类型并检查该 class 的属性。属性上有一个字符串参数可以正常使用,但命名的 Type
属性始终为 null。
[AttributeUsage(AllowMultiple = true)]
public class ExampleAttribute : Attribute
{
public ExampleAttribute(string name) {}
public System.Type Kind { get; set; }
public MyProject.MyColor { get; set; }
}
public enum MyColor { Red, Blue, Green }
[Example("one")] // Works fine
[Example("two", Kind = typeof(string))] // param "Kind" is null
[Example("two", Color = Color.Red)] // totally missing all values
public class ExampleClass
{
// ...
}
// elsewhere, in a different assembly, I'm detecting this:
new ExampleClass();
我用过无数种方法来获取类型信息,结果都是一样的。目前在生成器的“CreateSyntaxProvider”调用的“转换”回调中,我以这种方式获取属性:
var nameSyntax = context.Node as ObjectCreationExpressionSyntax.Type as IdentifierNameSyntax;
var typeSymbol = context.SemanticModel.GetSymbolInfo(typeSyntax).Symbol as INamedTypeSymbol;
var attributes = typeSymbol.GetAttributes();
此时,这些属性中的第一个没问题,attribute.ConstructorArguments
有一个值为“one”的字符串 Value
属性。
第二个也有一个构造函数参数值“two”,以及一个带有键“Kind”但值为 null 的 NamedArgument
。在检查中,参数值的私有 InternalValue
属性 是 MissingMetadataTypeSymbol
,并带有一条错误消息,表明它正在尝试将“类型”(System.Type) 解析为“MyProject.Type”。再多的命名空间更改或明确的命名空间限定似乎都无法解决此问题。
第三个属性完全是空的。没有构造函数参数,根本没有命名参数。
ExampleAttribute 和 Example class 在一个库中,生成器在另一个库中,两者都在应用程序中引用。该库和应用程序均以 .NET 6 为目标。
原来这是由于引用 Microsoft.CodeAnalysis.CSharp.Workspaces
而不是使用 Microsoft.CodeAnalysis.Analyzers
和 Microsoft.CodeAnalysis.CSharp
引起的。有点出乎意料,因为这些是 workspaces 包的依赖项,并且在 Google 上排名很高的几篇博客文章的示例中建议使用此包,但这实际上会导致各种奇怪的问题,例如生成的语法高亮错误代码,同时有点工作。
我无法从源生成器中的属性获取参数值。
我有一个 IIncrementalSourceGenerator,它应该查找 class 类型并检查该 class 的属性。属性上有一个字符串参数可以正常使用,但命名的 Type
属性始终为 null。
[AttributeUsage(AllowMultiple = true)]
public class ExampleAttribute : Attribute
{
public ExampleAttribute(string name) {}
public System.Type Kind { get; set; }
public MyProject.MyColor { get; set; }
}
public enum MyColor { Red, Blue, Green }
[Example("one")] // Works fine
[Example("two", Kind = typeof(string))] // param "Kind" is null
[Example("two", Color = Color.Red)] // totally missing all values
public class ExampleClass
{
// ...
}
// elsewhere, in a different assembly, I'm detecting this:
new ExampleClass();
我用过无数种方法来获取类型信息,结果都是一样的。目前在生成器的“CreateSyntaxProvider”调用的“转换”回调中,我以这种方式获取属性:
var nameSyntax = context.Node as ObjectCreationExpressionSyntax.Type as IdentifierNameSyntax;
var typeSymbol = context.SemanticModel.GetSymbolInfo(typeSyntax).Symbol as INamedTypeSymbol;
var attributes = typeSymbol.GetAttributes();
此时,这些属性中的第一个没问题,attribute.ConstructorArguments
有一个值为“one”的字符串 Value
属性。
第二个也有一个构造函数参数值“two”,以及一个带有键“Kind”但值为 null 的 NamedArgument
。在检查中,参数值的私有 InternalValue
属性 是 MissingMetadataTypeSymbol
,并带有一条错误消息,表明它正在尝试将“类型”(System.Type) 解析为“MyProject.Type”。再多的命名空间更改或明确的命名空间限定似乎都无法解决此问题。
第三个属性完全是空的。没有构造函数参数,根本没有命名参数。
ExampleAttribute 和 Example class 在一个库中,生成器在另一个库中,两者都在应用程序中引用。该库和应用程序均以 .NET 6 为目标。
原来这是由于引用 Microsoft.CodeAnalysis.CSharp.Workspaces
而不是使用 Microsoft.CodeAnalysis.Analyzers
和 Microsoft.CodeAnalysis.CSharp
引起的。有点出乎意料,因为这些是 workspaces 包的依赖项,并且在 Google 上排名很高的几篇博客文章的示例中建议使用此包,但这实际上会导致各种奇怪的问题,例如生成的语法高亮错误代码,同时有点工作。