예제 #1
0
        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));
        }
예제 #2
0
 public Option(ParameterTuple parameterTuple)
 {
     _parameterTuple = parameterTuple;
 }