作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设有一个类包含接口(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/
我正在尝试使用 Roslyn 来确定项目的公开 API(然后使用此信息进行一些进一步处理,所以我不能只使用反射)。我正在使用 SyntaxWalker 访问声明语法节点,并为每个节点调用 IModel
假设有一个类包含接口(interface)类型的私有(private)字段。用Roslyn分析上面的代码时,如何判断FieldDeclarationSyntax后面的类型是不是接口(interface
我正在尝试做的事情: 我正在使用 roslyn 编写代码重构。我的目标是创造一个类(class)。所以我所做的基本上是删除所有私有(private)员工,并用 throw new NotImpleme
我是一名优秀的程序员,十分优秀!