至于定义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
部分看起来会找到从AnalyzeSymbol
和ISomethingRoot1
继承的函数签名?
以下是我正在做的一些代码,以使问题更加清晰:
ISomethingRoot2
答案 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()
来获取会员。