无法解析Roslyn源生成中的参数参数



我在源生成器中从属性获取参数值时遇到了麻烦。

我有一个IIncrementalSourceGenerator,它应该查找类类型并检查该类的属性。属性上有一个字符串参数,但是命名的Type属性总是空的。

[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有一个字符串Value属性为&;one&;的值。

第二个也有一个构造函数参数值为"two",以及一个键为"kind"的NamedArgument。但是值是空的。通过检查,参数值的私有InternalValue属性是一个MissingMetadataTypeSymbol,并显示一条错误消息,表明它正在尝试解析"类型"。(System.Type)为"myproject . type"。再多的名称空间更改或显式的名称空间限定似乎也无法解决这个问题。

第三个属性完全为空。没有构造函数实参,没有命名形参。

ExampleAttribute和Example类在一个库中,生成器在另一个库中,两者都在应用程序中被引用。库和应用程序都以。net 6为目标。

所以这是由引用Microsoft.CodeAnalysis.CSharp.Workspaces而不是使用Microsoft.CodeAnalysis.AnalyzersMicrosoft.CodeAnalysis.CSharp引起的。有点出乎意料,因为这些都是工作区包的依赖关系,这个包在谷歌上排名很高的一些博客文章的例子中被建议,但这实际上会导致各种奇怪的问题,比如生成代码的语法高亮错误,同时有点工作。

最新更新