【问题标题】:How to determine if the type of a FieldDeclarationSyntax is an interface in Roslyn?如何确定 FieldDeclarationSyntax 的类型是否是 Roslyn 中的接口?
【发布时间】:2019-03-11 10:36:32
【问题描述】:

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

【问题讨论】:

  • 在提出此类问题时,请提供minimal reproducible example,以便愿意回答的人可以轻松验证他们的答案是否有效,而无需创建自己的测试代码。
  • @NineBerry 谢谢,已编辑。

标签: c# roslyn roslyn-code-analysis


【解决方案1】:

在 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}");
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-08
    • 2010-10-04
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多