Reflexion Bindinglist

Signaler
Messages postés
6
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
29 mai 2009
-
Messages postés
6
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
29 mai 2009
-
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);
                
A voir également:

4 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
51
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>))
   {
   }
}





<hr />
-Blog-
-Site Perso-
Messages postés
6
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
29 mai 2009

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 ..
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
51
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 !?

<hr />
-Blog-
-Site Perso-
Messages postés
6
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
29 mai 2009

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();
}
}
}
}