C#代码分析中如何判断TypeSyntax是否为枚举类型

实现方法
直接通过语义模型获取节点绑定的类型符号,判断类型种类即可,和VS属性面板判断"Enum Name"的底层逻辑完全一致:
- 用已有的逻辑获取
TypeSyntax所属语法树的语义模型 - 调用语义模型的
GetTypeInfo方法传入目标TypeSyntax节点,拿到绑定的类型信息 - 判断类型信息对应的
Type的TypeKind属性是否为TypeKind.Enum
可直接复用的代码
// typeSyntax 是你已经捕获到的目标节点 SemanticModel semanticModel = context.Compilation.GetSemanticModel(typeSyntax.SyntaxTree); TypeInfo typeInfo = semanticModel.GetTypeInfo(typeSyntax); // 结果为true就说明当前IdentifierNameSyntax指向的是枚举类型 bool isEnumName = typeInfo.Type?.TypeKind == TypeKind.Enum;
注意事项
- 不要尝试在语法层判断标识符名称来识别枚举,遇到类型重名、using别名、嵌套类型、跨程序集引用的场景会出现判断错误,只有语义模型的判断结果是100%准确的
- 这个判断逻辑对所有
TypeSyntax子类都生效,不止是IdentifierNameSyntax,碰到QualifiedNameSyntax(带命名空间前缀的枚举名)、AliasQualifiedNameSyntax(带别名的枚举名)场景也能正确识别 - 只要编译能正常找到对应类型符号,哪怕是引用的第三方程序集里的枚举、非公开的嵌套枚举,判断结果都不会出错
内容的提问来源于stack exchange,提问作者martinrhan
相关产品推荐
相关产品推荐

