c# - 如何确定 FieldDeclarationSyntax 的类型是否是 Roslyn 中的接口?
问题描述
假设有一个类包含接口类型的私有字段。用 Roslyn 分析上面的代码,如何判断后面的类型FieldDeclarationSyntax
是不是接口呢?使用下面的代码来检索ISymbol
字段声明的,我找不到任何类似IsInterface
或类似的属性。
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
public class SampleClass
{
public static void Main()
{
var str =
@"
namespace Sample
{
public interface IBar
{
void Do();
}
public class Foo
{
private IBar _bar;
}
}";
var syntaxTree = SyntaxFactory.ParseSyntaxTree(str);
var compilation = CSharpCompilation.Create("Sample", new[] { syntaxTree });
var semanticModel = compilation.GetSemanticModel(syntaxTree, true);
var classDeclarationSyntax =
semanticModel.SyntaxTree.GetRoot().DescendantNodes().OfType<ClassDeclarationSyntax>().First();
var fieldDeclarationSyntax = classDeclarationSyntax.DescendantNodes().OfType<FieldDeclarationSyntax>().First();
var declaredSymbol = semanticModel.GetDeclaredSymbol(fieldDeclarationSyntax.Declaration.Variables.First());
// declaredSymbol (ISymbol) contains properties like IsDefinition, IsVirtual etc. but nothing like IsInterface.
}
}
解决方案
在 fieldDeclarationSyntax.Declaration.Type 上调用 GetTypeInfo 终于成功了。完整的工作示例:
using System;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
public class SanpleClass
{
public static void Main()
{
var str =
@"
namespace Sample
{
public interface IBar
{
void Do();
}
public class Foo
{
private IBar _bar;
}
}";
var syntaxTree = SyntaxFactory.ParseSyntaxTree(str);
var compilation = CSharpCompilation.Create("Sample", new[] { syntaxTree });
var semanticModel = compilation.GetSemanticModel(syntaxTree, true);
var classDeclarationSyntax =
semanticModel.SyntaxTree.GetRoot().DescendantNodes().OfType<ClassDeclarationSyntax>().First();
var fieldDeclarationSyntax = classDeclarationSyntax.DescendantNodes().OfType<FieldDeclarationSyntax>().First();
var typeKind = semanticModel.GetTypeInfo(fieldDeclarationSyntax.Declaration.Type).Type.TypeKind;
var isInterface = typeKind == TypeKind.Interface;
Console.WriteLine($"Is Interface: {isInterface}");
}
}
推荐阅读
- cython - openMP 可以像多处理一样使用吗?
- view - couchbase 视图将如何对新文档进行索引?是最后添加的吗?
- javascript - 在 Javascript 循环中重新评估布尔表达式
- regex - 排除下划线的正则表达式,但前提是它们就在数字或大写字母之前?
- php - 如何使用 PHP 将 Nav webservice 生成的 odata 访问到 html 布局中
- javascript - Firebase PERMISSION_DENIED 没有数据库的推送通知
- git - 如果我们提交已经在远程仓库中的东西会发生什么
- c# - MultipleActiveResultSets=True 在调用存储过程时没有给出正确的结果
- django - 如何在 django-allauth 中自定义社交帐户模型
- c# - 序列包含几个元素 Dapper