如何在Roslyn中确定FieldDeclarationSyntax的类型是否为接口?

3
假设有一个包含接口类型私有字段的类。使用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.
    }
}

当询问此类问题时,请提供一个 [mcve],以便愿意回答的人可以轻松验证其答案是否有效,而无需创建自己的测试代码。 - NineBerry
@NineBerry 谢谢,已编辑。 - Konstantinos Papakonstantinou
1个回答

2

最终,调用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}");
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接