Saltar al contenido

cómo iterar sobre elementos de tupla

Luego de investigar en diversos repositorios y páginas al final nos encontramos con la respuesta que te mostraremos más adelante.

Solución:

Puede acceder a las propiedades y sus valores por reflexión con Type.GetProperties

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

Entonces su método será una consulta Linq muy simple

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));

Un problema aquí es que tienes que lidiar con múltiples Tuple tipos: Tuple, Tuple etc. (Supongo que desea que esto funcione con tuplas con un número arbitrario de elementos).

Una forma un tanto complicada de hacerlo es ver si el nombre del tipo comienza con 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);
        
    

Si no te gusta la frivolidad de FullName.StartsWith(...) puedes hacerlo más seguro para escribir así:

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;
    

Eres capaz de añadir valor a nuestra información dando tu veteranía en las anotaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *