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