示例#1
0
        private void CompileAssignmentFunc()
        {
            if (this.surrogate != null)
            {
                return;
            }
            if (this.type.IsValueType)
            {
                return;
            }
            if (this.fieldData.Length == 0)
            {
                return;
            }

            ParameterExpression sourceParameter    = Expression.Parameter(typeof(object), "source");
            ParameterExpression targetParameter    = Expression.Parameter(typeof(object), "target");
            ParameterExpression operationParameter = Expression.Parameter(typeof(ICloneOperation), "operation");
            ParameterExpression sourceCastVar      = Expression.Variable(this.type.AsType(), "sourceCast");
            ParameterExpression targetCastVar      = Expression.Variable(this.type.AsType(), "targetCast");

            List <Expression> mainBlock = this.CreateAssignmentFuncContent(operationParameter, sourceCastVar, targetCastVar);

            mainBlock.Insert(0, Expression.Assign(sourceCastVar, Expression.TypeAs(sourceParameter, this.type.AsType())));
            mainBlock.Insert(1, Expression.Assign(targetCastVar, Expression.TypeAs(targetParameter, this.type.AsType())));

            Expression mainBlockExpression = Expression.Block(new[] { sourceCastVar, targetCastVar }, mainBlock);

            this.assignFunc = Expression.Lambda <AssignmentFunc>(mainBlockExpression, sourceParameter, targetParameter, operationParameter).Compile();
        }
示例#2
0
        private void CompileAssignmentFunc()
        {
            if (this.surrogate != null) return;
            if (this.type.IsValueType) return;
            if (this.fieldData.Length == 0) return;

            ParameterExpression sourceParameter = Expression.Parameter(typeof(object), "source");
            ParameterExpression targetParameter = Expression.Parameter(typeof(object), "target");
            ParameterExpression operationParameter = Expression.Parameter(typeof(ICloneOperation), "operation");
            ParameterExpression sourceCastVar = Expression.Variable(type, "sourceCast");
            ParameterExpression targetCastVar = Expression.Variable(type, "targetCast");

            List<Expression> mainBlock = this.CreateAssignmentFuncContent(operationParameter, sourceCastVar, targetCastVar);

            mainBlock.Insert(0, Expression.Assign(sourceCastVar, Expression.TypeAs(sourceParameter, this.type)));
            mainBlock.Insert(1, Expression.Assign(targetCastVar, Expression.TypeAs(targetParameter, this.type)));

            Expression mainBlockExpression = Expression.Block(new[] { sourceCastVar, targetCastVar }, mainBlock);
            this.assignFunc = Expression.Lambda<AssignmentFunc>(mainBlockExpression, sourceParameter, targetParameter, operationParameter).Compile();
        }