Type List => récupérer nom

Résolu/Fermé
Utilisateur anonyme - Modifié par nagashima le 28/08/2014 à 08:22
 Utilisateur anonyme - 29 août 2014 à 08:04
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

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
28 août 2014 à 20:50
'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
Utilisateur anonyme
29 août 2014 à 08:04
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