【问题标题】:How to Compare Method ReturnType to Predefined Types如何将方法 ReturnType 与预定义类型进行比较
【发布时间】:2022-05-08 03:49:59
【问题描述】:

使用 Microsoft Roslyn,我试图确定方法返回类型是否为 void。
我的 MethodDeclarationSyntax 上有句柄,可以看到名为“ReturnType”的属性,这是一个 PredefinedType 的 void。我是否必须实际检查关键字种类?有没有更好的方法来做到这一点?

((PredefinedTypeSyntax)methodDec.ReturnType).Keyword.Kind() != SyntaxKind.VoidKeyword

有没有推荐的方法来完成我想要做的事情?

【问题讨论】:

    标签: .net roslyn


    【解决方案1】:

    对于void,这是完美的,因为没有其他方式可以表达。那里明确禁止说System.Void

    对于其他预定义类型,如 int,请记住,您可以使用关键字或 .NET 类型 System.Int32 编写它。根据您的情况,您可能真的很想区分它们,因此语法检查仍然是正确的。如果您不关心差异并且只想知道它是否是整数,那么您应该使用SemanticModel 进行一些绑定:

    var methodSymbol = (MethodSymbol)semanticModel.GetDeclaredSymbol(methodDecl);
    if (methodSymbol.ReturnType.SpecialType == SpecialType.System_Int32)
    {
        /* ...whatever goes here */
    }
    

    MethodSymbol 也有一个 ReturnsVoid 属性,如果你碰巧有它的符号,你可能会发现它很有用。

    【讨论】:

      【解决方案2】:

      您所描述的将引发非预定义返回类型的异常。

      试试这个:

      public static bool IsVoidFunction(this MethodDeclarationSyntax ms) 
        => ms.ReturnType is PredefinedTypeSyntax predefined 
           && predefined.Keyword.IsKind(SyntaxKind.VoidKeyword);
      

      【讨论】:

        猜你喜欢
        • 2015-06-24
        • 1970-01-01
        • 2019-12-05
        • 1970-01-01
        • 2018-07-12
        • 2018-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多