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)