Это расширение моих комментариев под вопросом и показывает вам, что я имел в виду.
Нетрудно создать список Tuple
динамически из списка типов в строковом формате. Например, используйте отражение:
private Type InferType(string typeName)
{
switch (typeName.ToLowerInvariant())
{
case "int":
return typeof(int);
case "float":
return typeof(float);
default:
return Type.GetType($"System.{typeName}", true, true);
}
}
private object CreateListOfTupleFromTypes(string[] types)
{
var elementTypes = types.Select(InferType).ToArray();
// Get Tuple<,,>
var tupleDef = typeof(Tuple)
.GetMethods(BindingFlags.Static | BindingFlags.Public)
.First(mi => mi.Name == "Create"
&& mi.GetParameters().Count() == elementTypes.Length)
.ReturnType
.GetGenericTypeDefinition();
// Get Tuple<int, float, DateTime>
var tupleType = tupleDef.MakeGenericType(elementTypes);
// Get List<Tuple<int, float, DateTime>>
var listType = typeof(List<>).MakeGenericType(tupleType);
// Create list of tuple.
var list = Activator.CreateInstance(listType);
return list;
}
Проблема в том, что список создается с использованием типов, известных только во время выполнения, в вашем коде вы никогда не сможете использовать этот список как строго типизированный список. т.е. List<Tuple<int, float, DateTime>>
.
Конечно, вы могли бы упростить жизнь, если список используется в вашем коде, используя ITuple
:
var list = new List<ITuple>();
list.Add(new Tuple<int, float, DateTime>(...);
int value1 = (int)list[0][0];
float value1 = (float)list[0][1];
DateTime value1 = (DateTime)list[0][2];
Однако, если вы это сделаете, то нет смысла использовать Tuple
. Вам нужен только List<object[]>
.
Итак, это возвращает к моему вопросу, для чего нужен список кортежей в вашем коде?