cs_jcg56123
Messages postés6Date d'inscriptionsamedi 7 juin 2003StatutMembreDernière intervention29 mai 2009
-
28 mai 2009 à 21:20
cs_jcg56123
Messages postés6Date d'inscriptionsamedi 7 juin 2003StatutMembreDernière intervention29 mai 2009
-
29 mai 2009 à 12:42
Bonjour je cherche à détecter via réflexion toutes les bidinglist contenues dans un object.
J'ai essayer le code ci-dessous mais ça ne marche pas... Même après une journée sur la doc, je cale.
Type type = o.GetType();
FieldInfo[] fi = type.GetFields();
foreach (FieldInfo f in fi)
{
//if (typeof(BindingList<>).IsAssignableFrom(f.FieldType))
MessageBox.Show(f.ToString() + " " + typeof(BindingList<>).ToString());
if( f.FieldType.IsAssignableFrom(typeof(BindingList<>)))
{
BindingList<Object> bl = (BindingList<Object>)f.GetValue(o);
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 29 mai 2009 à 08:20
Salut,
Pour info, GetFields retour les variables de classes qui sont public. Donc si elles sont private, ça marchera pas comme ça...
Ensuite, tu cherches bien les variables de classes? pas les Properties?
Pour les Properties, ça donnerait quelques chose comme ceci (similaire pour les variables de classes) :
Type type = c.GetType();
PropertyInfo[] fi = type.GetProperties();
foreach (PropertyInfo f in fi)
{
if (f.PropertyType == typeof(BindingList<XXX>))
{
}
}
cs_jcg56123
Messages postés6Date d'inscriptionsamedi 7 juin 2003StatutMembreDernière intervention29 mai 2009 29 mai 2009 à 09:49
Merci pour ton aide bidou !
C'est bien les Fields donc les variables publiques que je recherche !
Malheuresement je ne peut pas utiliser le test de type que tu me propose car je ne connais pas le type des éléments dans les bidinglists. J'ai essayé la méthodes assignableFrom. Je m'y prend peut-être comme un manche ..
Je suis d'accord pour tout ton code mais comment tester que j'ai au moins une bidinglist qui pourrait être caster en BidingList<Object> et pouvoir la parcourir ..
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 29 mai 2009 à 11:56
Pour info:
En C# 3.5 et inférieur, on ne peut pas convertir IEnumerable<XXXX> en IEnumerable<object>
En C# 4.0 par contre, la covariance a été implémentée et la conversion est donc possible.
Pour ton problème:
Je ne sais pas trop... je peux te donner une solution temporaire:
Type type = c.GetType();
FieldInfo[] fi = type.GetFields();
foreach (
FieldInfo f
in fi)
{
bool x f.FieldType.UnderlyingSystemType.Name "BindingList`1";
}
Mais je dirais que ça ressemble plus à du bricolage qu'autre chose...
Y'a probablement un moyen plus propre de faire ça !?
cs_jcg56123
Messages postés6Date d'inscriptionsamedi 7 juin 2003StatutMembreDernière intervention29 mai 2009 29 mai 2009 à 12:42
Je suis arrivé à ceci... C'est tout sauf sexy ... :( tout sauf reflexif comme je voudrais
Type type = o.GetType();
PropertyInfo[] fi = type.GetProperties();
foreach(PropertyInfo f in fi)
{
if(f.PropertyType.ToString().Contains("BindingList"))
{
Object unknowList = f.GetValue(o, null);
if(unknowList is BindingList<XXX>)
{
BindingList<XXX> listNiv = (BindingList<XXX>)unknowList;
foreach(Niveau n in listNiv)
{
DoWork();
}
}
}
}