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

Tho*_*que 12 .net c# code-analysis roslyn

我正在编写一个带有Roslyn的代码分析器,我需要检查它是否ExpressionSyntax是类型TaskTask<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;
}
Run Code Online (Sandbox Code Playgroud)

它的工作原理为Task,但不适合Task<int>Task<string>...我可以核对姓名和命名空间,但它是不切实际的,因为我要检查每个命名空间的"级别".

有推荐的方法吗?

SLa*_*aks 7

检查类型是否为泛型类型,如果是,则用于OriginalDefinition返回未构造的泛型类型.

  • 谢谢!我错过了这样一个事实,即我得到的 `ITypeInfo` 实际上是一个 `INamedTypeSymbol`,所以我看不到 `IsGeneric` 属性。但是`ConstructUnboundGenericType` 给了我`Task&lt;&gt;`,而不是`Task&lt;TResult&gt;`,所以它与我用`GetTypeFromMetadataName` 得到的类型不匹配。我不得不改用 [`ConstructedFrom`](http://source.roslyn.io/#Microsoft.CodeAnalysis/Symbols/INamedTypeSymbol.cs,2b034eb9d8cd5598) 属性。 (2认同)
  • 使用`OriginalDefinition` - 它会在所有情况下为您提供与GetTypeByMetadataName匹配的类型.在嵌套的通用或通用方法案例中,ConstructedFrom并不是您想要的. (2认同)