Подтвердить что ты не робот

Правильный способ проверки типа выражения в анализаторе Roslyn?

Я пишу анализатор кода с Roslyn, и мне нужно проверить, есть ли ExpressionSyntax типа Task или Task<T>.

Пока у меня есть это:

private static bool IsTask(ExpressionSyntax expression, SyntaxNodeAnalysisContext context)
{
    var type = context.SemanticModel.GetTypeInfo(expression).Type;
    if (type == null)
        return false;
    if (type.Equals(context.SemanticModel.Compilation.GetTypeByMetadataName("System.Threading.Tasks.Task")))
        return true;
    if (type.Equals(context.SemanticModel.Compilation.GetTypeByMetadataName("System.Threading.Tasks.Task`1")))
        return true;
    return false;
}

Он работает для Task, но не для Task<int> или Task<string>... Я мог проверить имя и пространство имен, но это непрактично, потому что я должен проверять каждый "уровень" пространства имен.

Есть ли рекомендуемый способ сделать это?

4b9b3361

Ответ 1

Проверьте, является ли тип общим типом, и, если это так, используйте OriginalDefinition, чтобы вернуть неконструированный общий тип.