2015-07-11 3 views
3

Каков правильный способ проверки типа переменной в анализаторе кода Roslyn? Я регистрируюсь для узла ObjectCreationExpressionSyntax, и я могу получить тип, но я не уверен, что правильный способ проверить, что это тип, о котором я забочусь.Проверка типа переменной для анализа кода

Я нашел способ сделать это, проверив строку отображения, но мне интересно, есть ли более правильный способ выполнить это. Например, вот код, который пытается проверить создание ArrayList.

private static void SyntaxValidator(SyntaxNodeAnalysisContext context) 
{ 
    var creation = (ObjectCreationExpressionSyntax)context.Node; 

    var variableType = creation.Type as IdentifierNameSyntax; 

    if (variableType == null) 
     return; 

    var variableTypeInfo = context.SemanticModel.GetTypeInfo(context.Node); 

    if (variableTypeInfo.Type != null && variableTypeInfo.Type.ToDisplayString().Equals("System.Collections.ArrayList")) 
    { 
     context.ReportDiagnostic(Diagnostic.Create(Rule, creations.GetLocation(), "")); 
    } 
} 

ответ

5

Нормальный шаблон для этого является использование Compilation.GetTypeByMetadataName(), а затем сравните это ITypeSymbol с кого ты вернулся из SemanticModel.GetTypeInfo().

Примечание: Обязательно используйте .Equals для сравнения ITypeSymbol экземпляров, так как некоторые из них не гарантируют идентификацию ссылки.

См.: http://source.roslyn.io/Roslyn.Diagnostics.Analyzers/R/fee46febeb0be269.html для примера анализатора, который делает это.

+1

ссылка не работает. Не могли бы вы отредактировать ответ, чтобы включить обновленную ссылку? –

Смежные вопросы