如何检查接口继承标记接口的接口函数?

时间:2015-11-21 23:19:43

标签: c# roslyn roslyn-code-analysis

至于定义Roslyn Analyzer规则的学习经验,假设我有接口定义为

//These are a marker interfaces.
public interface ISomethingRoot1 {}
public interface ISomethingRoot2 {}

public interface ISomething: ISomethingRoot1
{
    int SomeOperation();    
}

public interface ISomething2: ISomethingRoot2
{
    int SomeOperation2();
}

我怎样才能检查所有接口的函数签名(甚至可能是实现这些接口的类和继承自实现类的类,但现在是次要的)继承自标记接口ISomethingRoot1和{{1 }}?我看到至少有一个与此Finding all class declarations than inherit from another with Roslyn相关的问题,但我还没有掌握它。看起来我应该注册ISomethingRoot2次操作,但是SymbolKind.NamedType部分看起来会找到从AnalyzeSymbolISomethingRoot1继承的函数签名?

以下是我正在做的一些代码,以使问题更加清晰:

ISomethingRoot2

1 个答案:

答案 0 :(得分:2)

您可以使用以下内容获取对标记界面的引用:

var marker1 = context.SemanticModel.Compilation.GetTypeByMetadataName("NS.ISomethingRoot1");

然后,如果您位于SymbolAction NamedTypes,则可以检查当前处理的符号是否实现此marker1

var symbol = context.Symbol as INamedTypeSymbol;
var implements = symbol.AllInterfaces.Any(@interface => @interface.Equals(marker1));

然后你可以做任何你想要检查的类型成员。您可以致电symbol.GetMembers()来获取会员。