Type List => récupérer nom
Résolu
Utilisateur anonyme
-
Utilisateur anonyme -
Utilisateur anonyme -
salut à tous!
Voilà j'ai un petit soucis lors de la résolution de nom donné à un objet dans une classe lors de la lecture via réflexion.
Je m'explique :
J'ai la classe suivante :
Le but étant de connaitre les libellé des attributs, dans mon cas :"laListeDeString".
Je déclare mon objet :
et ensuite, je cherche à partir de mon objet à obtenir ce nom, pour le moment de cette manière :
cependant tout ce que je récupère est :
A noter que je ne donne pas le nom en fait, j'ai une fonction récursive qui récupère les objets.
Sauriez vous comment je peux récupérer ce nom ? cette méhode fonctionne très bien avec des types "classiques", comme pour les string, les classe, int, etc. . Mon problème est donc vis à vis des type génériques.
merci d'avance.
naga
Voilà j'ai un petit soucis lors de la résolution de nom donné à un objet dans une classe lors de la lecture via réflexion.
Je m'explique :
J'ai la classe suivante :
public class cTest
{
public List<string> laListeDeString;
}
Le but étant de connaitre les libellé des attributs, dans mon cas :"laListeDeString".
Je déclare mon objet :
cTest oTest = new cTest();
oTest.laListeDeString = new List<string>();
oTest.laListeDeString.Add("l1");
oTest.laListeDeString.Add("l2");
et ensuite, je cherche à partir de mon objet à obtenir ce nom, pour le moment de cette manière :
Type myType = oTest.laListeDeString.GetType();
string nom = myType.Name ;
cependant tout ce que je récupère est :
List'1
A noter que je ne donne pas le nom en fait, j'ai une fonction récursive qui récupère les objets.
Sauriez vous comment je peux récupérer ce nom ? cette méhode fonctionne très bien avec des types "classiques", comme pour les string, les classe, int, etc. . Mon problème est donc vis à vis des type génériques.
merci d'avance.
naga
1 réponse
-
'lut, les types génériques ont pour nom court
[type]'[nombre de types génériques]
. Leur nom long, obtenu avecmyType.FullName
, en plus de donner tout le chemin de nom d'espace avant le nom du type, donne les types utilisées en paramètres génériques, par exemple, pour unDictionary<string, int>
, le FullName estSystem.Collections.Generic.Dictionary'2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
.
Si ce format te convient, bien gardes-le ;)
Sinon, tu peux soit le reformater à partir du FullName, soit en combinantName
avec les noms de types données parmyType.GetGenericArguments()
.
Tout ceci est a faire après une vérification demyType.IsGenericType
bien sur, car si le type n'est pas générique, les résultats peuvent être inattendus.-
ok merci pour les précisions !
du coup j'ai pu faire ma méthode de sérialisation (je te passe les explications de pourquoi je suis amené à le faire moi même ^^), ce qui m'a permis donc de faire cette méthode :public static string serialise(object o) { string returnValue = ""; Type myType = o.GetType(); returnValue += "<" + myType.Name + " type='"+myType.FullName+"'>"; if (Convert.GetTypeCode(o) != TypeCode.Object) { return "<" + myType.Name + ">" + o.ToString() + "</" + myType.Name + ">"; } foreach (var oField in myType.GetFields()) { Type T = oField.FieldType; FieldInfo fi = myType.GetField(oField.Name); object s = fi.GetValue(o); if (Convert.GetTypeCode(s) != TypeCode.Object) { returnValue += "<" + oField.Name + " type='" + T.FullName + "'>" + s.ToString() + "</" + oField.Name + ">"; } else { if (s is System.Collections.IList) { returnValue += "<" + oField.Name + " type='" + T.FullName + "'>"; foreach (var v in (System.Collections.IList)s) { returnValue += serialise(v); } returnValue += "</" + oField.Name + ">"; } else { returnValue += "<" + oField.Name + " type='" + T.FullName + "'>" + serialise(s) + "</" + oField.Name + ">"; } } } returnValue += "</" + myType.Name + ">"; return returnValue; }
bon continuation !
naga
-