如何在 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
,因此有零个或多个 ArgumentSyntax
es (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
以获取有关类型参数等泛型类型的更多信息。
如标题所述,我想检查方法参数是否为泛型 + 方法的 return 类型是否为泛型。
例如:
public ISet<string> Collect(MethodDeclarationSyntax method, SemanticModel semanticModel)
{
return method
.ParameterList
.Parameters
.Select(x => x.Type.ToString())
.ToImmutableHashSet();
}
这里我想 return method
变量的所有参数类型,它们不是通用的,但我在 API 中找不到任何要过滤的东西结果。
我在检查方法的 return 类型是否为泛型时遇到同样的问题。
这取决于您的工作对象。如果您有一个 ArgumentListSyntax
,因此有零个或多个 ArgumentSyntax
es (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
以获取有关类型参数等泛型类型的更多信息。