如何在 Roslyn 中检查方法参数 type/return 类型是否通用?

How to check if method parameter type/return type is generic, in Roslyn?

如标​​题所述,我想检查方法参数是否为泛型 + 方法的 return 类型是否为泛型。

例如:

    public ISet<string> Collect(MethodDeclarationSyntax method, SemanticModel semanticModel)
    {
        return method
            .ParameterList
            .Parameters
            .Select(x => x.Type.ToString())
            .ToImmutableHashSet();
    }

这里我想 return method 变量的所有参数类型,它们不是通用的,但我在 API 中找不到任何要过滤的东西结果。

我在检查方法的 return 类型是否为泛型时遇到同样的问题。

这取决于您的工作对象。如果您有一个 ArgumentListSyntax,因此有零个或多个 ArgumentSyntaxes (ArgumentListSyntax.Arguments),您可以从参数表达式中获取类型信息:

var type = model.GetTypeInfo(argument.Expression).Type as INamedTypeSymbol;

从那里开始,IsGenericType 属性。例如:

Debug.Assert(type.IsGenericType);

如果你有一个MethodDeclarationSyntax方法的对象,你可以看到ReturnType属性是否是GenericNameSyntax的类型:

Debug.Assert(methodDeclaration.ReturnType is GenericNameSyntax);

转换为 GenericNameSyntax 以获取有关类型参数等泛型类型的更多信息。