Reflexion : nom list<T> [Résolu]

Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
- - Dernière réponse : nagaD.scar
Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
- 28 août 2014 à 17:02
Salut à tous,

Je cherche à connaitre le nom d'une liste.

C'est à dire, j'ai cette classe :

public class cTest
{
public string a;
public List<string> ls;
}

J'identifie le type de liste grâce à
System.Collections.IList
mais je ne parviens pas à déterminer le nom de ma liste. C'est à dire que pour le string, soit 'a', je parviens à récupérer le nom de cette manière :


Type myType = o.GetType();
string Nom = magicType.Name;
(o étant l'objet de type cTest).

Sauriez-vous de quelle manière je pourrai récupérer le nom de ma liste, soit "ls" ?

merci d'avance.
naga
Afficher la suite 

4 réponses

Meilleure réponse
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
1
Merci
Re,

non, je n'ai pas utilisé ta classe, j'ai pris un WindowsForm existant, j'ai rajouté la list<> et j'ai lancé le code donné (GetFields) avec le typeConteneur == le Formulaire.

Tu peux essayer ceci :

ouvres la console visualStudio, positionnes toi sur le répertoire de ton assembly, et lance
ildasm.exe tonAssembly.exe (ou dll)

Tu pourras voir la reflexion et le code IL en double cliquant sur le champ voulu.

bye...

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 120 internautes nous ont dit merci ce mois-ci

nagaD.scar
Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
16 -
ok merci je peux récupérer mon contenu ;)

bne continuation.
naga
Commenter la réponse de yann_lo_san
Messages postés
14507
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
22 juillet 2019
131
0
Merci
Si j'ai bien compris, tu cherches à récupérer le nom d'une variable en dynamique ?

Sinon, essayes de lister les champs (fields) et/ou propriétés de la classe.
nagaD.scar
Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
16 -
merci de répondre =D j'ai jamais de chances dans mes posts, ils doivent être trop spécifiques ^^
Oui en fait le code complet de la fonction est le suivant :



public static string serialise(object o)
{
string returnValue = "";

Type magicType = o.GetType();
returnValue += "<" + magicType.Name + ">";
foreach (var oField in magicType.GetFields())
{
Type T = oField.FieldType;
FieldInfo fi = magicType.GetField(oField.Name);
object s = fi.GetValue(o);
if (Convert.GetTypeCode(s) != TypeCode.Object)
{
returnValue += "<" + oField.Name + ">" + s.ToString() + "</" + oField.Name + ">";
}
else
{
if (s is System.Collections.IList)
{
returnValue += "<" + oField.Name + ">" + serialise(s) + "</" + oField.Name + ">";
}
else
{
returnValue += "<" + oField.Name + ">" + serialise(s) + "</" + oField.Name + ">";
}
}
}
returnValue += "</" + magicType.Name + ">";

return returnValue;
}

donc en gros l'idée est de refaire une sérialisation car je veux éviter d'utiliser les composant qui travaillent en xml. Si tu test ma fonction, tu remarquera que la liste est à pour nom "List'1" (à prioris c'est dû au fait que ca soit généric).
Ensuite je rate probablement quelque chose mais je ne vois pas quoi =/
Commenter la réponse de NHenry
Messages postés
13522
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juillet 2019
289
0
Merci
Bonsoir
ils doivent être trop spécifiques.....je veux éviter d'utiliser les composant qui travaillent en xml

Ha ba quand on veut réinventer l'Amérique aussi...

Et utiliser une classe comme ça:
public MaClasse
{
      public string Nom {get; set;}

      public string List<T> MesDonnees  {get; set;}
}

Penser aux balises de coloration syntaxique: bouton <>, préciser le langage :<code csharp>.
Quand la solution est trouvée, mettre la discussion Résolue.
nagaD.scar
Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
16 -
salut !

Ha ba quand on veut réinventer l'Amérique aussi...

c'est surtout que la dé-sérilisation se base sur de les classes xml qui comportent masse de fuites mémoire => la désérilisation d'un flux de 300Mo bouffe 550Mo en mémoire, et dans le cadre de mon travail ce n'est pas acceptable.

Mon problème correspond à la list en fait, non au type de list => je peux sans soucis récupérer les données contenu dans la liste et en connaitre le type, par contre le nom de élément n'est pas récupérer via Field, et c'est là tout mon problème =/
merci de ton aide
Whismeril
Messages postés
13522
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 juillet 2019
289 -
Ok mais au moment ou tu sérialises tu peux utiliser une classe comme je te l'ai proposé (enfin je ne connais pas l'ensemble de ton projet mais ça me semble jouable).

Sinon, il y a plusieurs outils de serialisation xml, les a tu tous testé? (XmlReader, Linq etc....)
nagaD.scar
Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
16 -
Je ne comprend pas la première partie de ton message ... a mon avis il te manque une information : en fait non avons pas mal d'automates permettant de récupérer des données et nos objets varient d'un programme à un autre. L'idée est donc d'avoir une méthode "standard" que nous n'aurions pas à éditer sur chaque projet.

Oui j'ai testé plusieurs sérialisation mais le problème se trouve au niveau de l'objet de lecture xml, qui, au chargement, provoque de nombreuses fuites de mémoire. Or les méthodes de sérialisation exploitent toutes cet objet.

J'ai pu remarquer ces fuites lors de traitement de données : plus le fichier est lourd, plus la lecture devient de plus en plus longue (par exemple sur un flux de 500Mo, le parcours des 100 premiers mo prendra 20 minutes, tandis que la lecture des 100 dernier peu prendre jusque plus d'une journée).
J'ai donc du palier cela en traitant directement le texte, ce qui me permet de bien mieux gérer ma mémoire (les 500Mo sont traités en moins d'une heure par exemple) , mais la dé-sérialisation elle est bien trop lourd, malgrès l'appel du garbage collector, d'où mon développement.

En fait la sérialisation n'est pas nécessaire pour moi car elle ne pose pas de gros problème en soit, mais c'est la désérialisation. Or, la sérialisation étant bien plus simple de la désérialisation (qui va exploiter ce que la sérialisation utiliser, et +), j'ai préféré commencer par pouvoir sérialiser. Et mon problème aurai finalement été le même donc bon ^^
Commenter la réponse de Whismeril
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
0
Merci
Salut,

Avec ceci je récupère bien le nom de ma liste<> générique :

FieldInfo[] arrFi = leTypeConteneur.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
foreach (FieldInfo fi in arrFi)
{
    // fi.Name contient le nom de la liste
}


List1 est le Name du FieldType

bye...
nagaD.scar
Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
16 -
en supposant que tu as pris ma classe, ce que tu me propose est exactement le problème que je rencontre, soit le fait que je ne récupère que
List'1
et non
ls
, qui est donc le nom que j'ai donné à ma variable ...
Merci d'essayer de m'aider en tout cas =D

Pour info, j'ai donc essayé de faire :

if (o is System.Collections.IList)
{
FieldInfo[] arrFi = myType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
foreach (FieldInfo fi in arrFi)
{
string s = fi.Name;
// fi.Name contient le nom de la liste
}
}
Commenter la réponse de yann_lo_san