gpt4 book ai didi

c# - 如何确定 FieldDeclarationSyntax 的类型是否是 Roslyn 中的接口(interface)?

转载 作者:行者123 更新时间:2023-11-30 16:38:22 24 4
gpt4 key购买 nike

假设有一个类包含接口(interface)类型的私有(private)字段。用Roslyn分析上面的代码时,如何判断FieldDeclarationSyntax后面的类型是不是接口(interface)?使用下面的代码检索字段声明的 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}");
}
}

关于c# - 如何确定 FieldDeclarationSyntax 的类型是否是 Roslyn 中的接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55099933/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com