【发布时间】: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