Reflexion : nom list<T>

Résolu
nagaD.scar Messages postés 4280 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 - 27 août 2014 à 09:15
nagaD.scar Messages postés 4280 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 - 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

4 réponses

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 24
28 août 2014 à 16:16
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...
1
nagaD.scar Messages postés 4280 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 16
28 août 2014 à 17:02
ok merci je peux récupérer mon contenu ;)

bne continuation.
naga
0
NHenry Messages postés 15069 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 29 mai 2023 158
27 août 2014 à 12:55
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.
0
nagaD.scar Messages postés 4280 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 16
27 août 2014 à 13:32
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 =/
0
Whismeril Messages postés 18416 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 juin 2023 624
Modifié par Whismeril le 27/08/2014 à 18:22
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.
0
nagaD.scar Messages postés 4280 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 16
28 août 2014 à 07:58
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
0
Whismeril Messages postés 18416 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 juin 2023 624
28 août 2014 à 08:26
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....)
0
nagaD.scar Messages postés 4280 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 16
28 août 2014 à 09:07
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 ^^
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 24
28 août 2014 à 15:36
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...
0
nagaD.scar Messages postés 4280 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 16
28 août 2014 à 15:52
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
}
}
0