Reflection sur un tableau [Résolu]

Signaler
Messages postés
10
Date d'inscription
dimanche 5 janvier 2003
Statut
Membre
Dernière intervention
10 juin 2007
-
Messages postés
10
Date d'inscription
dimanche 5 janvier 2003
Statut
Membre
Dernière intervention
10 juin 2007
-
Bonjour,
Je bute sur un problème et j'ai vraiment besoin de votre aide.
Par réflection je récupère le champ "field" de ma classe "my_class"
Si c'est un tableau il faut que je récupère son contenu pour le stocker.
Le probleme c'est que je ne connais pas à l'avance le type du tableau. Ca peut etre un tableau d'int, de string, de double..., à une ou deux dimensions, et de taille inconnu.

J'arrive à voir le type, si c'est un tableau, et le nombre de dimensions.

FieldInfo field = ....

Type my_type = field.FieldType;
bool my_array = field.FieldType.IsArray;
int my_array_rank = field.FieldType.GetArrayRank();

Si le type est "system.int32[]", par exemple, je peu récupérer le contenu

int index = 0;

int[] res = (
int[])field.GetValue(my_class);

while (index < res.GetLength(0))
{

Debug.WriteLine(
"tab[" + index +
"]: " + res[index].ToString());
index++;
}

Donc mon problème c'est que je connais pas le type.
J'ai essayé de le caster en object[]: object
[] res = (
object[])field.GetValue(my_class);

Ca me donne "Unable to cast object..."
Il me faudrait un truc du genre: (
Type.GetType(my_type))field.GetValue(my_class);

mais ca marche pas non plus

Quelqu'un a une idée??
Meci pour votre aide.




 

2 réponses

Messages postés
168
Date d'inscription
jeudi 28 juin 2001
Statut
Membre
Dernière intervention
18 octobre 2008
7
Salut,

Pour faire référence à un tableau de type quelconque, il existe un type plus générique que object[] : System.Array.
Premièrement, il faut convertir l'élément en Array par un cast. Ensuite, il est possible d'itérer dessus avec un boucle foreach. Les méthodes Length, Rank, etc. permettent de connaître les dimensions du tableau :

Array my_generic_array = (Array)field.GetValue(my_class);
foreach (object o in my_generic_array) // Itération sur le tableau (ici, les éléments sont automatiquement convertit en object)
{
    Console.WriteLine(o);
}

Une autre solution (moins générique) consiste à tester le type de ton tableau :
object my_array = field.GetValue(my_class);
if (my_array is int[])
{
    int[] typped_array = (int[])my_array;
    // ...
}
else if (my_array is string[])
{
    int[] typped_array = (int[])my_array;
    // ...
}
// ...
Messages postés
10
Date d'inscription
dimanche 5 janvier 2003
Statut
Membre
Dernière intervention
10 juin 2007

C'est parfait.
Je crois que je vais utiliser la première methode, ca correspond plus à ce que je cherche.
Merci beaucoup pour ton aide.