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

时间:2017-06-14 07:52:41

标签: c# .net roslyn

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

如果catch声明包含要捕获的类型的变量名,我可以按照本文中的描述执行此操作: Get Symbol from CatchDeclaration

示例:

...
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类型的符号吗?

1 个答案:

答案 0 :(得分:3)

  

但是如果catch声明没有包含被捕获类型的变量名,那么我就会遇到问题。

那是因为当没有声明符号时你不能使用catch(NullReferenceException exception)exception声明catch(NullReferenceException)符号,但ITypeSymbol exceptionType = model.GetTypeInfo(catchDeclarationSyntax.Type).Type; 不符号。

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

<Grid>
   <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="238,89,0,0" VerticalAlignment="Top" Width="75" Click="button_Click"/>
   <Controls:TransitioningContentControl x:Name="transitioning" Transition="Down">
      <StackPanel>
         <TextBox x:Name="textBox1" HorizontalAlignment="Left" Height="95" Margin="345,51,0,0" TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" VerticalAlignment="Top" Width="211" Controls:TextBoxHelper.Watermark="Hi Im a watermark" Background="#FF7400FF"/>
         <TextBox x:Name="textBox2" HorizontalAlignment="Left" Height="95" Margin="0,51,0,0" TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" VerticalAlignment="Top" Width="211" Controls:TextBoxHelper.Watermark="Hi im another watermark" Background="#FF7400FF"/>
      </StackPanel>
   </Controls:TransitioningContentControl>
</Grid>