public LambdaExpression Decompiler(bool enableNullSafe) { LambdaExpression lambdaExpression = this.RegisterCore(enableNullSafe); var newparameter1 = Expression.Variable(parameterTuple.Destination.Type, parameterTuple.Destination.Name); var newparameter2 = Expression.Parameter(parameterTuple.Source.Type, parameterTuple.Source.Name); var newparameter3 = Expression.Parameter(parameterTuple.ErrorMsg.Type.MakeByRefType(), parameterTuple.ErrorMsg.Name); ParameterTuple newParameterTuple = new ParameterTuple(newparameter1, newparameter2, newparameter3); var body = this.Body; var newBody = ParameterReplacer.Replace(body, parameterTuple.Collect().ToArray(), newParameterTuple.Collect().ToArray()) as BlockExpression; ReturnTargetRewriter returnTargetRewriter = null; if (hasReturnLabel) { returnTargetRewriter = new ReturnTargetRewriter(parameterTuple.Destination.Type, Expression.Default(parameterTuple.Destination.Type)); newBody = returnTargetRewriter.Visit(newBody) as BlockExpression; } //初始化临时变量并构造新的lambda表达式 //去掉原来lambda表达式最后的return true var initExpression = Expression.Assign(newparameter1, Expression.New(newparameter1.Type)); Expression returnExpression = null; int exprCount = newBody.Expressions.Count - 1; if (hasReturnLabel) { returnExpression = Expression.Label(returnTargetRewriter.LabelTarget, returnTargetRewriter.DefaultValue); ++exprCount; } else { returnExpression = newparameter1; } var newBlockExpression = Expression.Block(new[] { newparameter1 }.Concat(newBody.Variables), new[] { initExpression }.Concat(newBody.Expressions.Take(exprCount)).Concat(new[] { returnExpression })); return(Expression.Lambda(newBlockExpression, newParameterTuple.Source, newParameterTuple.ErrorMsg)); }
public Option(ParameterTuple parameterTuple) { _parameterTuple = parameterTuple; }