无法解析 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.AnalyzersMicrosoft.CodeAnalysis.CSharp 引起的。有点出乎意料,因为这些是 workspaces 包的依赖项,并且在 Google 上排名很高的几篇博客文章的示例中建议使用此包,但这实际上会导致各种奇怪的问题,例如生成的语法高亮错误代码,同时有点工作。