Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SyntaxFactory.ParseStatement生成额外的空格_C#_Roslyn - Fatal编程技术网

C# SyntaxFactory.ParseStatement生成额外的空格

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

我想创建一个基于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] = 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);}}}如果您可以看到有两个大括号用于方法的开始和结束