Un problème ici est que vous devez traiter plusieurs types Tuple
: (. Je suppose que vous voulez que cela fonctionne avec tuples avec un nombre arbitraire d'éléments) Tuple<T1, T2>
, Tuple<T1, T2, T3>
etc.
Une façon un peu hacky de le faire pour voir si le nom du type commence par 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 vous ne souhaitez pas le hackyness de FullName.StartsWith(...)
vous pouvez le rendre plus typesafe comme ceci:
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;
}
}
ce qui vous émettez –
'valeurs var = tuple.GetType(). GetProperties(). Sélectionnez (property => property.GetValue (tuple))' – Fabio