从 Roslyn 中的方法符号生成方法签名的语法
Generating syntax for a method signature from a method symbol in Roslyn
我正在尝试使用 Roslyn(新用户)生成代码。我发现它太冗长了,我只能假设我做错了什么。目前,我正在为给定的 IMethodSymbol
(来自接口)生成一个方法的实现:
private static MethodDeclarationSyntax GetMethodDeclarationSyntax(IMethodSymbol methodSymbol)
{
if (methodSymbol.MethodKind != MethodKind.Ordinary)
{
return null;
}
var parameters = methodSymbol
.Parameters
.Select(x => SF
.Parameter(SF.Identifier(x.Name))
.WithType(SF.IdentifierName(x.Type.ToDisplayString(symbolDisplayFormat))));
return SF
.MethodDeclaration(
SF.IdentifierName(methodSymbol.ReturnType.ToDisplayString(symbolDisplayFormat)),
SF.Identifier(methodSymbol.Name))
.WithModifiers(
SF.TokenList(
SF.Token(SyntaxKind.PublicKeyword)))
.WithParameterList(
SF.ParameterList(
SF.SeparatedList<ParameterSyntax>(parameters)));
}
它已经相当庞大了,我还没有考虑实际的实现、通用参数、ref
/out
参数等等。
有没有更简单的方法来实现这个?
从 VS 2015 CTP 6 和 Roslyn 1.0-rc1 NuGet 包开始,请查看 SyntaxGenerator
class。
给定 ,这就是我得出的结论:
var methodDeclaration = syntaxGenerator.MethodDeclaration(methodSymbol);
methodDeclaration = syntaxGenerator
.WithModifiers(
methodDeclaration,
syntaxGenerator
.GetModifiers(methodDeclaration)
.WithIsAbstract(false));
methodDeclaration = syntaxGenerator
.WithStatements(
methodDeclaration,
GetMethodStatementsSyntax(syntaxGenerator, semanticModel, methodSymbol));
请注意,我们必须手动从方法符号中删除 abstract
修饰符(因为它源自接口,所以本质上是 abstract
)。我还添加语句 after 删除 abstract
修饰符,否则它们将被忽略。
我正在尝试使用 Roslyn(新用户)生成代码。我发现它太冗长了,我只能假设我做错了什么。目前,我正在为给定的 IMethodSymbol
(来自接口)生成一个方法的实现:
private static MethodDeclarationSyntax GetMethodDeclarationSyntax(IMethodSymbol methodSymbol)
{
if (methodSymbol.MethodKind != MethodKind.Ordinary)
{
return null;
}
var parameters = methodSymbol
.Parameters
.Select(x => SF
.Parameter(SF.Identifier(x.Name))
.WithType(SF.IdentifierName(x.Type.ToDisplayString(symbolDisplayFormat))));
return SF
.MethodDeclaration(
SF.IdentifierName(methodSymbol.ReturnType.ToDisplayString(symbolDisplayFormat)),
SF.Identifier(methodSymbol.Name))
.WithModifiers(
SF.TokenList(
SF.Token(SyntaxKind.PublicKeyword)))
.WithParameterList(
SF.ParameterList(
SF.SeparatedList<ParameterSyntax>(parameters)));
}
它已经相当庞大了,我还没有考虑实际的实现、通用参数、ref
/out
参数等等。
有没有更简单的方法来实现这个?
从 VS 2015 CTP 6 和 Roslyn 1.0-rc1 NuGet 包开始,请查看 SyntaxGenerator
class。
给定
var methodDeclaration = syntaxGenerator.MethodDeclaration(methodSymbol);
methodDeclaration = syntaxGenerator
.WithModifiers(
methodDeclaration,
syntaxGenerator
.GetModifiers(methodDeclaration)
.WithIsAbstract(false));
methodDeclaration = syntaxGenerator
.WithStatements(
methodDeclaration,
GetMethodStatementsSyntax(syntaxGenerator, semanticModel, methodSymbol));
请注意,我们必须手动从方法符号中删除 abstract
修饰符(因为它源自接口,所以本质上是 abstract
)。我还添加语句 after 删除 abstract
修饰符,否则它们将被忽略。