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(); }
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(); }