我可以在语法级别得到
MemberDeclarationSyntax.Modifiers
,但是一旦我在语义级别,处理ISymbol
,我不知道如何取回给定的ISymbol
的修饰符?
在我的用例(源生成器)中,我想获取部分属性声明的所有上下文修饰符(特别是包括
partial
关键字)以生成其实现。
作为参考,这里是我的代码
MemberDeclarationSyntax
var contextualModifiers = memberDeclarationSyntax?.Modifiers
.Where(syntaxToken => syntaxToken.IsContextualKeyword());
我在使用
IPropertySymbol
时找不到方法。
源生成器很棒,但超级混乱!让我来照亮它们,因为我认为你实际上有一个问题 X,并且你正在寻找问题 Y 的解决方案。
当您使用
Syntax
时,您将可以访问当前所在文件的语法树的每个节点。这可能是您想要继续的更好方法。
当您切换到语义模型并开始使用
Symbol
时,编译器已经对源代码进行了一些处理并将所有部分类组合在一起。
两个文件的示例:
One.foo.cs
public partial class One
{
public bool First { get; set; }
}
One.bar.cs
public partial class One
{
public bool Second { get; set; }
}
使用
Syntax
时,这些将是两个独立的语法树,在处理文件 One.Second
时您将无法看到 One.foo.cs
属性。
切换到语义模型时,这两个类将合并为
INamedTypeSymbol
类型的一个实体,我不确定这是否是您真正想要的。
现在解决你的 Y 问题
您有
memberDeclarationSyntax
,所以您可以这样做:
var symbol = context.SemanticModel.GetDeclaredSymbol(memberDeclarationSyntax);
这将为您带来
ISymbol
,因为它是所有符号的公共接口,并且在 C# 中,方法需要返回类型。但实际上它实际上是 IPropertySymbol
类的一个对象,所以你需要做的就是转换它。
var propertySymbol = (IPropertySymbol)symbol;
现在您可以检查一下
if(propertySymbol.IsPartialDefinition)
{
// DO STUFF
}