Roslyn:从没有变量名的 catch 声明中获取符号

Roslyn: Get Symbol from catch declaration having no variable name

我有一个 CatchDeclarationSyntax 实例,我想获取语句中捕获的类型的符号。

如果 catch 声明包含被捕获类型的变量名,我可以按照本文中的描述进行操作:

示例:

...
catch(NullReferenceException exception)
{
    ...
}

获取 NullReferenceException 类型的符号:

ILocalSymbol catchDeclarationSymbol = semanticModel.GetDeclaredSymbol(catchDeclarationSyntax);
ITypeSymbol exceptionType = catchDeclarationSymbol.Type;

这很好用。

但是如果 catch 声明包含被捕获类型的变量名,我就有问题了。

示例:

...
catch(NullReferenceException)
{
    ...
}

获取类型 NullReferenceException 的符号 不会 这样工作:

ILocalSymbol catchDeclarationSymbol = semanticModel.GetDeclaredSymbol(catchDeclarationSyntax);
// catchDeclarationSymbol is now null

在这种情况下,有人知道如何获取 NullReferenceException 类型的符号吗?

But if the catch declaration doesn't contain a variable name for the type being catched, I have problems.

那是因为当没有符号被声明时你不能使用GetDeclaredSymbolcatch(NullReferenceException exception) 声明了 exception 符号,但 catch(NullReferenceException) 没有。

相反,您可以访问该类型的语法节点,然后获取该类型的类型符号:

ITypeSymbol exceptionType = model.GetTypeInfo(catchDeclarationSyntax.Type).Type;