Esempio n. 1
0
        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));
            }
        }
Esempio n. 2
0
        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));
            }
        }