2010-09-24 3 views
0

Si j'ai un Tuple<int, double> déclaré, je voudrais obtenir ce qui suit.Comment obtenir les composants d'un Tuple en C#?

  1. Un objet, j'imagine que c'est un objet de type, que je peux effectuer la comparaison sur, à l'effet de obj == typeof(Tuple<>) et ce serait revenir true. Un tableau d'objets Type, équivalent à new[]{typeof(int), typeof(double)}. Cela je peux comprendre avec la réflexion, puisque l'objet tuple expose ses articles comme propriétés, mais alors je ne connais pas l'ordre de ces propriétés et l'article de MSDN indique que je ne peux pas compter sur l'observation ...

J'ai besoin de ceci pour faire un cas particulier pour une méthode générique, qui devrait faire quelque chose de spécial si elle est passée à un tuple. Tel est:

void foo<T>(...){ 
    if(T == Tuple<Q, S, ...>){ 
    //special code that needs to know what Q and S and ... are. 
    } 
} 

Merci d'avance.

Répondre

2
if (typeof(T).IsGenericType && typeof(T).GetGenericTypeDefinition() == typeof(Tuple<,,>)) 
{ 
} 

Vous devez savoir avant de la main le nombre d'arguments pour Tuple (dans ce cas 3, donc deux virgules). En d'autres termes, Tuple <> est distincte de Tuple <,>, etc. Une fois que vous savez qu'il est du type correct, vous pouvez appeler:

typeof(T).GetGenericArguments() 

qui retourne un tableau des arguments de type transmis au Tuple.

+0

Merci beaucoup. Dommage que je dois savoir le nombre d'arguments à l'avance cependant. Je suppose qu'il n'y a pas moyen de contourner cela? – Gleno

+0

Eh bien, il y a un nombre fini de permutations de Tuple, donc vous pouvez planifier pour eux. Par exemple, vous pouvez stocker tous les 16 types dans un tableau et obtenir celui qui correspond au nombre d'arguments de type == GetGenericArguments(). Length. –

Questions connexes