我一直在研究一些 Roslyn代码分析器。我的目标是分析异常和Catch
块。
当我能够分析节点并获得节点可能引发的每个NamedType
的{{1}}时,我遇到了这种情况。与此同时,我能够枚举与此类节点相关的所有Exception
块。
我需要解决给定的Catch
是否等于NamedType
表达式声明或其基类。
说明性代码:
Catch
答案 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