C #: Y a-t-il un moyen de redimensionner un tableau de type inconnu en utilisant la reflection?

Mes utilisateurs me transmettent un tableau d’un type quelconque, par exemple int [] ou ssortingng []. Je peux facilement interroger les types d’éléments via GetElementType et savoir combien de temps le tableau a été transféré via GetRank, GetLength, etc.

Les tableaux sont passés dans une liste de parameters, visualisez donc le code comme ceci:

public void Resizer(params object[] objs) { foreach (object o in objs) Array.Resize(ref o, 3); } 

Ce que je voudrais faire, c’est l’inverse des méthodes Get disponibles et qui fonctionnent: je veux redimensionner le tableau qui m’a été transmis, en définissant la longueur à une autre longueur (comme 3 dans cet exemple stupide).

Je le fais parce que, dans mon contexte, le tableau contiendra les données reçues d’un ensemble de serveurs de cloud computing et nous ne pouvons pas savoir combien de personnes répondront à l’avance. Nous ne pouvons donc pas préallouer le tableau pour qu’il ait la bonne longueur. Dans l’idéal, en fait, mon utilisateur passe dans un tableau de longueur 0 et je renvoie un tableau de longueur n, ce qui signifie que j’ai reçu n réponses des serveurs interrogés.

Je ne peux pas faire cela avec Array.Resize (ref T, int) car je ne sais pas T au moment de la compilation.

Y at-il un moyen de retirer ceci?

Cela devrait fonctionner:

 static void Resize(ref Array array) { Type elementType = array.GetType().GetElementType(); Array newArray = Array.CreateInstance(elementType, newSize); Array.Copy(array, newArray, Math.Min(array.Length, newArray.Length); array = newArray; } 

Pourquoi ne pas simplement créer un nouveau tableau du type souhaité, quelle que soit sa taille? Puis remplissez-le à partir du tableau que vous souhaitez redimensionner, en définissant des valeurs inexistantes sur certaines valeurs par défaut.

Au cas où quelqu’un serait curieux, j’ai fini par changer mon code pour utiliser List

Je suis d’accord avec les commentaires selon lesquels vous devriez utiliser List (Of T), mais si vous souhaitez copier votre tableau dans un nouveau tableau du même type, vous pouvez procéder de la manière suivante.

 // Your passed in array. object[] objs = new object[5] {1,2,3,4,5}; // Create an array of the same type. Array a = Array.CreateInstance(objs[0].GetType(), objs.Length+3); // Copy in values. objs.CopyTo(a,0); 

Je suppose que je vais simplement passer à l’utilisation de listes, mais c’est dommage; le code sera un peu plus confus et, étant donné que mes utilisateurs se situent essentiellement au niveau du premier semestre, chaque petite chose leur rendra la vie moins agréable. Mais je soupçonne que vous ne voyez pas le moyen de le faire non plus. Tant pis….