public Expression CreateToObject(Type convertType, Type originType, ParameterExpression bytes, ParameterExpression startIndex, Boolean littleEndian, Func <Expression, Expression> loopController) { if (!(convertType.IsPrimitive || convertType.IsEnum)) { Assistant.CheckCycle(convertType); } if (originType.IsArray) { var elementType = originType.GetElementType(); var list = Expression.Variable(typeof(List <>).MakeGenericType(elementType)); return(Expression.Block( new[] { list }, new Expression[] { Expression.Assign( list, Expression.New(typeof(List <>).MakeGenericType(elementType))), loopController(Expression.Call(list, nameof(List <Object> .Add), null, SingleToObject(convertType, elementType, bytes, startIndex, littleEndian))), Expression.Call(list, nameof(List <Object> .ToArray), null) })); } else { return(SingleToObject(convertType, originType, bytes, startIndex, littleEndian)); } }
public Expression CreateGetBytes(Type convertType, Expression value, Boolean littleEndian) { if (!(convertType.IsPrimitive || convertType.IsEnum)) { Assistant.CheckCycle(convertType); } if (value.Type.IsArray) { var valueVariable = Expression.Variable(value.Type); if (convertType == typeof(Byte) && value.Type == typeof(Byte[])) { return(Expression.Block( new[] { valueVariable }, new Expression[] { Expression.Assign(valueVariable, value), valueVariable })); } if (convertType.IsPrimitive) { var bytesResult = Expression.Variable(typeof(Byte[])); var index = Expression.Variable(typeof(Int32)); return(Expression.Block( new[] { valueVariable, bytesResult, index }, new Expression[] { Expression.Assign(valueVariable, value), Expression.Assign( index, Expression.Constant(0)), Expression.Assign( bytesResult, Expression.NewArrayBounds( typeof(Byte), Expression.Multiply( Expression.Constant(Marshal.SizeOf(convertType)), Expression.Property(valueVariable, nameof(Array.Length))))), ExpressionExtension.Foreach(valueVariable, item => Expression.Block( Expression.Call( SingleGetBytes(convertType, item, littleEndian), nameof(Array.CopyTo), null, bytesResult, index), Expression.AddAssign(index, Expression.Constant(Marshal.SizeOf(convertType))))), bytesResult })); } else { var list = Expression.Variable(typeof(List <Byte>)); return(Expression.Block( new[] { valueVariable, list }, new Expression[] { Expression.Assign(valueVariable, value), Expression.Assign( list, Expression.New(typeof(List <Byte>))), ExpressionExtension.Foreach(valueVariable, item => Expression.Call( list, nameof(List <Byte> .AddRange), null, SingleGetBytes(convertType, item, littleEndian))), Expression.Call(list, nameof(List <Byte> .ToArray), null) })); } } else { return(SingleGetBytes(convertType, value, littleEndian)); } }