Esempio n. 1
0
        public static void TupleTypeConstructionTest()
        {
            var builder = new ValueTupleBuilder();

            Equal(typeof(ValueTuple), builder.Build());
            builder.Add <DateTime>();
            Equal(typeof(ValueTuple <DateTime>), builder.Build());
            builder.Add <string>();
            Equal(typeof(ValueTuple <DateTime, string>), builder.Build());
            builder.Add <int>();
            Equal(typeof(ValueTuple <DateTime, string, int>), builder.Build());
            for (int i = 0; i < 16; i++)
            {
                builder.Add <bool>();
            }
            Equal(19, builder.Count);
            var tupleType = builder.Build();

            Equal(typeof(ValueTuple <, , , , , , ,>), tupleType.GetGenericTypeDefinition());
        }
Esempio n. 2
0
        public static void TupleRestTypeConstructionTest()
        {
            var builder = new ValueTupleBuilder();

            Equal(typeof(ValueTuple), builder.Build());
            builder.Add <DateTime>();
            Equal(typeof(ValueTuple <DateTime>), builder.Build());
            builder.Add <string>();
            Equal(typeof(ValueTuple <DateTime, string>), builder.Build());
            builder.Add <int>();
            Equal(typeof(ValueTuple <DateTime, string, int>), builder.Build());
            for (int i = 0; i < 5; i++)
            {
                builder.Add <bool>();
            }
            Equal(8, builder.Count);

            var tupleType = builder.Build();

            Equal(typeof(ValueTuple <bool>), tupleType.GetField("Rest")?.FieldType);

            var members = builder.Build(Expression.New, out _);

            Equal(typeof(DateTime), members[0].Type);
            Equal(typeof(bool), members[7].Type);
        }
Esempio n. 3
0
        /// <summary>
        /// Constructs value tuple.
        /// </summary>
        /// <returns>Value tuple.</returns>
        public Type Build()
        {
            switch (Count)
            {
            case 0:
                return(typeof(ValueTuple));

            case 1:
                return(typeof(ValueTuple <>).MakeGenericType(items[0]));

            case 2:
                return(typeof(ValueTuple <,>).MakeGenericType(items[0], items[1]));

            case 3:
                return(typeof(ValueTuple <, ,>).MakeGenericType(items[0], items[1], items[2]));

            case 4:
                return(typeof(ValueTuple <, , ,>).MakeGenericType(items[0], items[1], items[2], items[3]));

            case 5:
                return(typeof(ValueTuple <, , , ,>).MakeGenericType(items[0], items[1], items[2], items[3], items[4]));

            case 6:
                return(typeof(ValueTuple <, , , , ,>).MakeGenericType(items[0], items[1], items[2], items[3], items[4], items[5]));

            case 7:
                return(typeof(ValueTuple <, , , , , ,>).MakeGenericType(items[0], items[1], items[2], items[3], items[4], items[5], items[6]));

            default:
                return(typeof(ValueTuple <, , , , , , ,>).MakeGenericType(items[0], items[1], items[2], items[3], items[4], items[5], items[6], Rest.Build()));
            }
        }