C# SyntaxFactory.ParseStatement生成额外的空格
我想创建一个基于json值的方法。 这是我的json:C# SyntaxFactory.ParseStatement生成额外的空格,c#,roslyn,C#,Roslyn,我想创建一个基于json值的方法。 这是我的json: "handler": { "logic": "var response = new IsoMessage(context.Request.Id + 10); \n for (int i = 0; i < 128; i++)\n if ((i != 64) && context.Request.Has(i)) \n response[i] = co
"handler": {
"logic": "var response = new IsoMessage(context.Request.Id + 10); \n for (int i = 0; i < 128; i++)\n if ((i != 64) && context.Request.Has(i)) \n response[i] = context.Request[i]; \n\n await Task.Delay(200); \n\n await context.SourceLink.SendAsync(response);"
}
在打印之前,它是代码:
var code=@namespace.NormalizeWhitespace().ToFullString()
输出如下:
public async Task ProcessAsync(Nikan.Channels.IncomingMessageContext context)
{
var response = new IsoMessage(context.Request.Id + 10); for ( int i = 0 ; i < 128 ; i ++ ) if ( ( i != 64 ) && context . Request . Has ( i ) ) response [ i ] = context . Request [ i ] ; await Task . Delay ( 200 ) ; await context . SourceLink . SendAsync ( response ) ;
}
var response = new IsoMessage ( context . Request . Id + 10 ) ;
public async Task ProcessAsync(Nikan.Channels.IncomingMessageContext)
{
var response=new IsoMessage(context.Request.Id+10);for(int i=0;i<128;i++)if((i!=64)和&context.Request.Has(i))response[i]=context.Request[i];wait Task.Delay(200);wait context.SourceLink.SendAsync(response);
}
函数中有大量空间,并且没有应用换行符:(正在解析的代码包含多条语句,而不是一条语句。如果注意到第一条语句:
var response = new IsoMessage(context.Request.Id + 10);
格式正确,看起来不像这样:
public async Task ProcessAsync(Nikan.Channels.IncomingMessageContext context)
{
var response = new IsoMessage(context.Request.Id + 10); for ( int i = 0 ; i < 128 ; i ++ ) if ( ( i != 64 ) && context . Request . Has ( i ) ) response [ i ] = context . Request [ i ] ; await Task . Delay ( 200 ) ; await context . SourceLink . SendAsync ( response ) ;
}
var response = new IsoMessage ( context . Request . Id + 10 ) ;
因此,当使用SyntaxFactory.ParseStatement()
时,如果您的代码由多个语句组成,则使用一对大括号({…}
)将所有语句包围,并强制转换为块语法
,随后将代码解析为“块”:
同样在方法声明中,请删除SyntaxFactory.Block(),因为它现在应转换为正确的类型:
.WithBody(syntax);
然后,您的代码应输出以下内容:
public async Task ProcessAsync(Nikan.Channels.IncomingMessageContext context)
{
var response = new IsoMessage(context.Request.Id + 10);
for (int i = 0; i < 128; i++)
if ((i != 64) && context.Request.Has(i))
response[i] = context.Request[i];
await Task.Delay(200);
await context.SourceLink.SendAsync(response);
}
public async Task ProcessAsync(Nikan.Channels.IncomingMessageContext)
{
var响应=新的等轴消息(context.Request.Id+10);
对于(int i=0;i<128;i++)
if((i!=64)&&context.Request.Has(i))
response[i]=context.Request[i];
等待任务。延迟(200);
wait context.SourceLink.SendAsync(响应);
}
请将.var syntax=SyntaxFactory.ParseCompilationUnit(逻辑);var methodDeclaration=SyntaxFactory.methodDeclaration(SyntaxFactory.ParseTypeName(typeof(Task.Name),“ProcessAsync”).WithBody(SyntaxFactory.Block(语法));-----------------------------------------------------------------------------------------------------------------------------------------出现错误:无法从“Microsoft.CodeAnalysis.CSharp.Syntax.CompilationUnitSyntax”转换为“Microsoft.CodeAnalysis.SyntaxList”@HappyDeveloper我已更新我用一个现在应该可以工作的解决方案来回答我的问题。than you@Ray,但是因为逻辑的语法将在方法体中使用,所以方法体将以这种方式有两个大括号。----------------------------------------------------------------var syntax=SyntaxFactory.ParseStatement(“{+logic+”}”);-------------------------------------------------------------var methodDeclaration=SyntaxFactory.methodDeclaration(SyntaxFactory.ParseTypeName(typeof(Task.Name),“ProcessAsync”).AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword)).WithBody(SyntaxFactory.Block(语法));公共异步重写任务ProcessAsync(Nikan.Channels.IncomingMessageContext){var response=new IsoMessage(context.Request.Id+10);for(int i=0;i<128;i++)if((i!=64)&&context.Request.Has(i))response[i]=context.Request[i];wait Task.Delay(200);wait context.SourceLink.SendAsync(response);}}}如果您可以看到有两个大括号用于方法的开始和结束