在 Roslyn 分析器中检查表达式类型的正确方法?

Correct way to check the type of an expression in Roslyn analyzer?

我正在用 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>...我可以检查名称和命名空间,但这不切实际,因为我必须检查每个 "level" 的命名空间。

有推荐的方法吗?

检查类型is a generic type, and, if it is, use OriginalDefinition是否为return未构造的泛型类型。

如果您需要符号而不是语法

INamedTypeSymbol nulable = compilation.GetTypeByMetadataName("System.Nullable`1");
INamedTypeSymbol int32 = compilation.GetSpecialType(SpecialType.System_Int32);
INamedTypeSymbol nulableInt = nulable.Construct(int32);