Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

183
Vistas
how to iterate over tuple items

How to iterate over items in a Tuple, when I dont know at compile-time what are the types the tuple is composed of? I just need an IEnumerable of objects (for serialization).

private static IEnumerable TupleToEnumerable(object tuple)
{
    Type t = tuple.GetType();
    if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Tuple<,>))
    {
        var x = tuple as Tuple<object, object>;
        yield return x.Item1;
        yield return x.Item2;
    }
}
about 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

You can access properties and their values by reflection with Type.GetProperties

var values = tuple.GetType().GetProperties().Select(p => p.GetValue(tuple));

So your method will be very simple Linq query

private static IEnumerable TupleToEnumerable(object tuple)
{
    // You can check if type of tuple is actually Tuple
    return tuple.GetType()
        .GetProperties()
        .Select(property => property.GetValue(tuple));
}
about 4 years ago · Santiago Trujillo Denunciar

0

In .NET Core 2.0+ or .NET Framework 4.7.1+, there are

  • t.Length
  • t[i]

it's from an interface ITuple interface

var data = (123, "abc", 0.983, DateTime.Now);
ITuple iT = data as ITuple;

for(int i=0; i<iT.Length;i++)
  Console.WriteLine(iT[i]);
about 4 years ago · Santiago Trujillo Denunciar

0

An issue here is that you have to deal with multiple Tuple types: Tuple<T1, T2>, Tuple<T1, T2, T3> etc. (I'm assuming that you want this to work with tuples with an arbitrary number of items.)

A somewhat hacky way of doing this it to see if the name of the type begins with System.Tuple:

public static IEnumerable TupleToEnumerable(object tuple)
{
    Type t = tuple.GetType();

    if (t.IsGenericType && t.GetGenericTypeDefinition().FullName.StartsWith("System.Tuple"))
    {
        for (int i = 1;; ++i)
        {
            var prop = t.GetProperty("Item" + i);

            if (prop == null)
                yield break;

            yield return prop.GetValue(tuple);
        }
    }
}

If you don't like the hackyness of FullName.StartsWith(...) you can make it more typesafe like so:

public static IEnumerable TupleToEnumerable(object tuple)
{
    Type t = tuple.GetType();

    if (isTupleType(t))
    {
        for (int i = 1;; ++i)
        {
            var prop = t.GetProperty("Item" + i);

            if (prop == null)
                yield break;

            yield return prop.GetValue(tuple);
        }
    }
}

private static bool isTupleType(Type type)
{
    if (!type.IsGenericType)
        return false;

    var def = type.GetGenericTypeDefinition();

    for (int i = 2;; ++i)
    {
        var tupleType = Type.GetType("System.Tuple`" + i);

        if (tupleType == null)
            return false;

        if (def == tupleType)
            return true;
    }
}
about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda