Type List => récupérer nom

Résolu
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 :


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

  1. ElementW Messages postés 5690 Statut Contributeur 1 293
     
    'lut, les types génériques ont pour nom court
    [type]'[nombre de types génériques]
    . Leur nom long, obtenu avec
    myType.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 un
    Dictionary<string, int>
    , le FullName est
    System.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 combinant
    Name
    avec les noms de types données par
    myType.GetGenericArguments()
    .

    Tout ceci est a faire après une vérification de
    myType.IsGenericType 
    bien sur, car si le type n'est pas générique, les résultats peuvent être inattendus.
    0
    1. Utilisateur anonyme
       
      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
      0