解决Catch表达式中声明的异常类型

时间:2016-08-19 10:07:32

标签: c# roslyn analysis roslyn-code-analysis

我一直在研究一些 Roslyn代码分析器。我的目标是分析异常和Catch块。

当我能够分析节点并获得节点可能引发的每个NamedType的{​​{1}}时,我遇到了这种情况。与此同时,我能够枚举与此类节点相关的所有Exception块。

我需要解决给定的Catch是否等于NamedType表达式声明或其基类。

说明性代码:

Catch

1 个答案:

答案 0 :(得分:2)

您需要使用语义模型。

掌握它之后你可以这样做:

// var declaredType = analysisContext.SemanticModel.GetDeclaredSymbol(@catch.Declaration).Type;
// ^^ only works on catch(FooException x), doesn't work on catch (FooException) 
var declaredType = analysisContext.SemanticModel.GetTypeInfo(@catch.Declaration.Type);
var implements = false;
for (var i = declaredType.Type; i != null; i = i.BaseType)
{
    if (i == exceptionType)
    {
        implements = true;
        break;
    }
}
// implements holds the result