Прежде всего, в вашем классе анализатора, внутри метода Initialize
вы должны зарегистрировать действие узла синтаксиса :
public override void Initialize(AnalysisContext context)
{
context.RegisterSyntaxNodeAction(SyntaxNodeAnalyze, SyntaxKind.InvocationExpression);
}
В этом методе мы зарегистрировали метод SyntaxNodeAnalyze
для получения обратных вызовов от анализатора. Внутри этого метода, используя SyntaxNodeAnalysisContext, мы можем запросить информацию о semantic objects
. В следующем примере я использовал SemanticModel
, чтобы иметь возможность перечислять пользовательские атрибуты, которые были объявлены, и теперь я использовал их выше объявления метода.
private static void SyntaxNodeAnalyze(SyntaxNodeAnalysisContext context)
{
SemanticModel semanticModel = context.SemanticModel;
InvocationExpressionSyntax method = (InvocationExpressionSyntax)context.Node;
var info = semanticModel.GetSymbolInfo(method).Symbol;
if (info == null)
return new List<AttributeData>();
var attribs = info.GetAttributes().Where(f => f.AttributeClass.MetadataName.Equals(typeof(ThrowsExceptionAttribute).Name));
foreach (var attrib in attribs)
{
...
}
}
Как вы можете видеть из приведенного выше кода, мы можем собрать полезную информацию, используя метод GetSymbolInfo
в SemanticModel. Вы можете использовать этот метод для получения информации о Methods , Properties и других семантических объектах.