Как получить идентификатор класса из экземпляра объекта с помощью Roslyn - PullRequest
0 голосов
/ 12 мая 2019

Я пытаюсь создать анализатор, который будет определять, откуда происходит каждый вызов метода, особенно из класса, где метод определен.

Давайте предположим, что у нас есть следующий код:

 Movie myMovie = new Movie();
 myMovie.Rent();

мой анализатор до сих пор может возвращать выражение myMovie.Rent() как ExpressionSyntax

Что именно я хочу, - это когда анализатор обнаружил вызов метода с использованием объекта в этом случае myMovie.Rent(), возвращает класс гдеметод определен и объект создается в этом случае Movie.

Я заблокирован, поэтому я не написал никакого кода для него, если у вас есть идея или пример кода, я ценю это.

1 Ответ

1 голос
/ 12 мая 2019

Прежде всего, в вашем классе анализатора, внутри метода 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 и других семантических объектах.

...